我使用
DoubleAnimation
进行缩放和平移进出地图.我的地图是一张分辨率很高的图像(15,000 x 8,438).问题在于,第一次变焦动画非常摇摇晃晃并且不平滑,第二次它变得越来越好等等.如何在执行动画之前使动画更流畅或者使图像或动画更有效,或者使用其他形式的动画?
我的代码:
namespace AnimationTest { public partial class MainWindow : Window { ScaleTransform transP; TranslateTransform trans2P; DoubleAnimation animP; DoubleAnimation animYP; DoubleAnimation animXP; TransformGroup myTransformGroupP; public MainWindow() { InitializeComponent(); transP = new ScaleTransform(); trans2P = new TranslateTransform(); myTransformGroupP = new TransformGroup(); myTransformGroupP.Children.Add(transP); myTransformGroupP.Children.Add(trans2P); animP = new DoubleAnimation(1,20,TimeSpan.FromMilliseconds(3000)); animXP = new DoubleAnimation(0,-14000,TimeSpan.FromMilliseconds(3000)); animYP = new DoubleAnimation(0,-4000,TimeSpan.FromMilliseconds(3000)); } private void button1_Click(object sender,RoutedEventArgs e) { image1.RenderTransform = myTransformGroupP; transP.BeginAnimation(ScaleTransform.ScaleXProperty,animP); transP.BeginAnimation(ScaleTransform.ScaleYProperty,animP); trans2P.BeginAnimation(TranslateTransform.XProperty,animXP); trans2P.BeginAnimation(TranslateTransform.YProperty,animYP); } } }
解决方法
我没有尝试过你的动画方法,我试图实现我自己的逻辑.
首先,我受到Picasa使用的缩放动画的启发.所以我试图实现类似类型的动画,这对我来说在我的core2duo处理器上工作正常,图像大小为10000×5000,没有任何延迟.
这种方法消耗了大量内存,但是当我将内存使用量与Picasa ImageViewer进行比较时,它几乎是相同的.这种方法可能会增加应用程序的加载时间,但这可以处理,而不是问题.
这是我使用的主窗口网格代码.
<Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Button Grid.Row="0" Height="30" Width="100" Content="Zoom" Click="ButtonZoom_OnClick" /> <Image RenderOptions.BitmapScalingMode="HighQuality" Stretch="Uniform" Width="100" Height="100" Grid.Row="1" Margin="30" VerticalAlignment="Center" HorizontalAlignment="Center" Source="mad1.jpg" Name="ImageMain" x:FieldModifier="private" /> </Grid>
按钮单击事件代码
private void ButtonZoom_OnClick(object sender,RoutedEventArgs e) { Task.Factory.StartNew(() => { var i = 0; while (i++ < 100) { var i1 = i; //var i1 = (-0.00092)*(i*i) + (0.092)*i + 0.2; Dispatcher.Invoke(new Action(() => { if (i1 < 10 || i1 > 90) { ImageMain.Height += 0.5; ImageMain.Width += 0.5; } else if (i1 < 30 || i1 > 70) { ImageMain.Height += 1; ImageMain.Width += 1; } else { ImageMain.Height += 3; ImageMain.Width += 3; } })); Thread.Sleep(30); } }); }
此代码中的注释行是用于加速和加速动画的平滑动画的二次方程.根据计算得到0.2和0.5的一半,在0.2的范围内停止,在[0-100]的范围内.如果要创建完全自定义的动画,可以使用WolframAlpha检查动画图形.但简单的方法是使用简单的控制语句来控制你的动画.