超炫,超酷的silverlight 动画效果
时间:2010-08-26 来源:cnblogs版主
图片旋转控件(.cs)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Threading;
using System.Windows.Media.Imaging;
/*
* A 3D Image Space Demonstration in C#
*/
namespace ImageSpace3D
{
public partial class ImageSpace3D : UserControl
{
private static String[] IMAGES = {"image1.png", "image2.png", "image3.png", "image4.png", "image5.png", "image6.png", "image7.png", "image8.png", "image9.png", "image10.png",
"image11.png", "image12.png", "image13.png", "image14.png", "image15.png", "image16.png", "image17.png", "image18.png", "image19.png" };
// images
private static string IMAGE_PATH = "./images/";
private static double IMAGE_WIDTH = 128; // Image Width
private static double IMAGE_HEIGHT = 128; // Image Height
private static double SPACE_LENGTH = 2000; // dimension of the 3d space
private static double X_MUL = 10; // springness toward x axis
private static double Y_MUL = 10; // springness toward y axis
private static double Z_MUL = 20; // springness toward z axis
private static double Z_MOVEMENT = 8; // speed toward z axis
private static double NEW_SCALE = 0.6; // additional scale on the images (Use this if your image is too large)
private static double EFFECT_FACTOR = 0.3; // Control the feeling of the 3D Space (Change it to differnt to see the differences)
// Must set less than 0.5
private List<Image> _images= new List<Image>();
private Dictionary<Image, Point3D> _imagePoint3Ds = new Dictionary<Image, Point3D>();
private Canvas _holder = new Canvas();
public Point3D _camera = new Point3D(); // _camera
public Point3D _destination = new Point3D(0, 0, -500); // move desination
// on enter frame simulator
private DispatcherTimer _timer;
private static int FPS = 24;
public ImageSpace3D()
{
InitializeComponent();
// add the holder to the canvas
_holder.SetValue(Canvas.LeftProperty, Width/ 2);
_holder.SetValue(Canvas.TopProperty, Height / 2);
LayoutRoot.Children.Add(_holder);
// add all the texts to the stage
addImages();
// not enough? create more
addImages();
// start the enter frame event
_timer = new DispatcherTimer();
_timer.Interval = new TimeSpan(0, 0, 0, 0, 1000 / FPS);
_timer.Tick +=new EventHandler(_timer_Tick);
_timer.Start();
}
/////////////////////////////////////////////////////
// Handlers
/////////////////////////////////////////////////////
void image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Image image = sender as Image;
Point3D point3D = _imagePoint3Ds[image];
// set the _camera to the position of the text
_destination.z = point3D.z + SPACE_LENGTH;
_destination.y = point3D.y + IMAGE_WIDTH / 2 * NEW_SCALE;
_destination.x = point3D.x + IMAGE_HEIGHT / 2 * NEW_SCALE;
}
void _timer_Tick(object sender, EventArgs e)
{
// move the _camera automatically
_destination.z += Z_MOVEMENT;
_camera.z += (_destination.z - _camera.z) / Z_MUL;
_camera.x += (_destination.x - _camera.x) / X_MUL;
_camera.y += (_destination.y - _camera.y) / Y_MUL;
// rearrange the position of the texts
posImage();
}
/////////////////////////////////////////////////////
// Private Methods
/////////////////////////////////////////////////////
private void addImages(){
int seed = (int)DateTime.Now.Ticks;
for (int i = 0; i < IMAGES.Length; i++)
{
// create a random object
seed += (int)DateTime.Now.Ticks;
Random r = new Random(seed);
// load the image
String url = IMAGE_PATH + IMAGES[i];
Image image = new Image();
image.Source = new BitmapImage(new Uri(url, UriKind.Relative));
// randomly assign the position
Point3D point3D = new Point3D();
point3D.x = r.NextDouble() * Width - Width / 2;
point3D.y = r.NextDouble() * Height - Height / 2;
point3D.z = r.NextDouble() * SPACE_LENGTH * 2 - SPACE_LENGTH;
// update the image property
image.SetValue(Canvas.LeftProperty, point3D.x);
image.SetValue(Canvas.TopProperty, point3D.y);
image.MouseLeftButtonDown += new MouseButtonEventHandler(image_MouseLeftButtonDown);
image.Cursor = Cursors.Hand;
_imagePoint3Ds.Add(image, point3D);
_holder.Children.Add(image);
_images.Add(image);
}
}
private void posImage()
{
for( int i = 0; i < _images.Count; i++){
Image image = _images[i];
Point3D point3D = _imagePoint3Ds[image];
double zActual = SPACE_LENGTH + (point3D.z - _camera.z);
double scale = SPACE_LENGTH / zActual - EFFECT_FACTOR;
// update the image position and scale
if(scale > 0){
image.SetValue(Canvas.LeftProperty, (point3D.x - _camera.x) * scale);
image.SetValue(Canvas.TopProperty, (point3D.y - _camera.y) * scale);
ScaleTransform scaleTransform = new ScaleTransform();
scaleTransform.ScaleX = scale * NEW_SCALE;
scaleTransform.ScaleY = scale * NEW_SCALE;
image.RenderTransform = scaleTransform;
image.Opacity = 1 - 0.99 * zActual / SPACE_LENGTH * 0.5;
// sort the children according to the scale
image.SetValue(Canvas.ZIndexProperty, (int)(SPACE_LENGTH - point3D.z));
}else{
// if text move over the screen, place it at the back
point3D.z += SPACE_LENGTH * 2;
}
}
}
}
}
xaml
<UserControl x:Class="ImageSpace3D.ImageSpace3D"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="550" Height="400">
<Canvas x:Name="LayoutRoot" Background="White">
</Canvas>
</UserControl>
point 3D
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
/*
* A 3D Image Space Demonstration in C#
*/
namespace ImageSpace3D
{
public class Point3D
{
public double x;
public double y;
public double z;
public Point3D()
{
}
public Point3D(double x, double y, double z){
this.x = x;
this.y = y;
this.z = z;
}
}
}
相关阅读 更多 +
排行榜 更多 +










