【问题标题】:c# Animation, using TranslateTransform and DoubleAnimationc#动画,使用TranslateTransform和DoubleAnimation
【发布时间】:2015-06-15 02:54:36
【问题描述】:

我有一个简单的地图和一个正方形,我想通过 B 和 C 从点 A 移动到 D。我已经声明了一个 Animate 方法:

    public void Animate(double[] FirstPoint, double[] SecondPoint, Image img)
    {
        double x1 = FirstPoint[0];
        double x2 = SecondPoint[0];

        double y1 = FirstPoint[1];
        double y2 = SecondPoint[1];

        TranslateTransform trans = new TranslateTransform();
        img.RenderTransform = trans;
        DoubleAnimation anim1 = new DoubleAnimation(y1, y2, TimeSpan.FromSeconds(1));
        DoubleAnimation anim2 = new DoubleAnimation(x1, x2, TimeSpan.FromSeconds(1));
        trans.BeginAnimation(TranslateTransform.YProperty, anim1);
        trans.BeginAnimation(TranslateTransform.XProperty, anim2);
    }

主要问题是当我使用这样的方法时:

obj.Animate(obj.A, obj.B, Car);
obj.Animate(obj.B, obj.C, Car);
obj.Animate(obj.C, obj.D, Car);

...只有从C点到D点的动画显示。当我将MessageBox.Show添加到Animate方法时,它可以正确显示动画。

我觉得我可能不完全理解使用这些类为对象设置动画背后的概念。有什么想法吗?

【问题讨论】:

  • 使用故事板堆叠动画(为动画指定适当的BeginTime)。

标签: c# animation


【解决方案1】:

您可以使用此代码作为示例来了解如何使用多个动画。

这是 MainWindow.xaml.cs 的完整代码。

public partial class MainWindow : Window
{
    private const string CarTransform = "CarTransform";
    private Image _car;

    public MainWindow()
    {
        InitializeComponent();
        Loaded += MainWindow_Loaded;
    }

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        Loaded -= MainWindow_Loaded;
        // create and add Car image to LayoutRoot grid
        _car = new Image();
        _car.Source = new BitmapImage(new Uri("/car-icon-hi.png", UriKind.Relative));
        _car.Width = 64;
        _car.Height = 64;
        _car.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
        _car.VerticalAlignment = System.Windows.VerticalAlignment.Top;
        _car.Margin = new Thickness(5);
        _car.RenderTransform = new TranslateTransform();
        LayoutRoot.Children.Add(_car);
    }

    private DoubleAnimation CreateAnimationFor(double from, double to, TimeSpan? beginTime, string targetName, DependencyProperty propertyPath)
    {
        DoubleAnimation da = new DoubleAnimation();
        da.From = from;
        da.To = to;
        da.Duration = new Duration(TimeSpan.FromMilliseconds(1000));
        if (beginTime != null)
            da.BeginTime = beginTime;

        Storyboard.SetTargetName(da, targetName);
        Storyboard.SetTargetProperty(da, new PropertyPath(propertyPath));

        return da;
    }

    private void StartAnimationClick(object sender, RoutedEventArgs e)
    {
        TranslateTransform _trans = _car.RenderTransform as TranslateTransform;

        this.RegisterName(CarTransform, _trans); // register name for TranslateTransform instance, this action is needed for working a Storyboard with multiple animations

        Storyboard sb = new Storyboard();
        // from A to B
        sb.Children.Add(CreateAnimationFor(0, 100, null, CarTransform, TranslateTransform.XProperty));
        sb.Children.Add(CreateAnimationFor(0, 0, null, CarTransform, TranslateTransform.YProperty));
        // from B to C
        sb.Children.Add(CreateAnimationFor(100, 100, TimeSpan.FromSeconds(1), CarTransform, TranslateTransform.XProperty));
        sb.Children.Add(CreateAnimationFor(0, 100, TimeSpan.FromSeconds(1), CarTransform, TranslateTransform.YProperty));
        // from C to D
        sb.Children.Add(CreateAnimationFor(100, 300, TimeSpan.FromSeconds(2), CarTransform, TranslateTransform.XProperty));
        sb.Children.Add(CreateAnimationFor(100, 250, TimeSpan.FromSeconds(2), CarTransform, TranslateTransform.YProperty));
        sb.Begin(this);
    }
}

这段代码的结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 2015-10-11
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 2018-08-24
    • 2021-04-23
    相关资源
    最近更新 更多