加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 非平滑DoubleAnimation

发布时间:2020-12-15 17:39:13 所属栏目:百科 来源:网络整理
导读:我使用 DoubleAnimation 进行缩放和平移进出地图.我的地图是一张分辨率很高的图像(15,000 x 8,438).问题在于,第一次变焦动画非常摇摇晃晃并且不平滑,第二次它变得越来越好等等.如何在执行动画之前使动画更流畅或者使图像或动画更有效,或者使用其他形式的动画
我使用 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检查动画图形.但简单的方法是使用简单的控制语句来控制你的动画.

此代码仅用于缩放图像,缩小时您的方法类似.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读