暂停动画旋转,设置角度值,然后稍后恢复?

Posted

技术标签:

【中文标题】暂停动画旋转,设置角度值,然后稍后恢复?【英文标题】:Pausing an animation rotation, setting the angle value, then resuming later? 【发布时间】:2010-09-09 06:49:00 【问题描述】:

我有一个 3d 模型,它有一个恒定的旋转动画。当用户触摸屏幕时,我希望旋转停止,并且用户的控件接管旋转的动画。

我试图通过暂停动画,在本地设置旋转的角度属性,然后恢复旋转来做到这一点。但是,我发现由于dependency property precedence,我的设置值在动画暂停时被忽略。

我能想到的唯一解决方法是让触摸控制相机,而动画控制实际模型。不幸的是,这会导致其他复杂性,我更希望这两个操作都控制模型本身。

   //In carousel.cs 
   public void RotateModel(double start, double end, int duration)
    
        RotateTransform3D rt3D = _GroupRotateTransformY;
        Rotation3D r3d = rt3D.Rotation;
        DoubleAnimation anim = new DoubleAnimation();
        anim.From = start;
        anim.To = end;
        anim.BeginTime = null;
        anim.AccelerationRatio = 0.1;
        anim.DecelerationRatio = 0.6;
        anim.Duration = new TimeSpan(0, 0, 0, 0, duration);
        ac = anim.CreateClock();
        ac.Completed += new EventHandler(OnRotateEnded);
        ac.Controller.Begin();
        r3d.ApplyAnimationClock(AxisAngleRotation3D.AngleProperty, ac);

    //In another file
    void Carousel_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
    
        var delta = e.DeltaManipulation;         

        RotateTransform3D rt = Carousel.RotateTransform;

        ((AxisAngleRotation3D)rt.Rotation).Angle += (-e.DeltaManipulation.Translation.X/3000) * 360.0;


        e.Handled = true;


    

    void Carousel_PreviewTouchUp(object sender, TouchEventArgs e)
    
        Carousel.ResumeRotationAnimation();
    

    void Carousel_PreviewTouchDown(object sender, TouchEventArgs e)
    
        Carousel.PauseRotationAnimation();
    

【问题讨论】:

【参考方案1】:

我遇到了同样的需求(也是 3D,也是 Model3DGroup 旋转)并这样做了:

当动画需要停止时,我会获取动画属性的当前双精度值(并将其存储在本地)。

var temp = myAxisAngleRotation.Angle;

然后我使用

从依赖属性中删除动画
myAxisAngleRotation.BeginAnimation(AxisAngleRotation3D.AngleProperty, null);

并将动画依赖属性设置为存储的值。

myAxisAngleRotation.Angle = temp;

当动画需要恢复时,我会创建一个以当前值开始的新动画。

DoubleAnimation anim = new DoubleAnimation();
anim.From = myAxisAngleRotation.Angle;
anim.To = end;
anim.Duration = new TimeSpan(0, 0, 0, 0, duration);
myAxisAngleRotation.BeginAnimation(AxisAngleRotation3D.AngleProperty, anim);

完成!

如果您希望动画以恒定速度运行,则在计算持续时间时必须考虑距离 (Math.Abs(anim.To-anim.From))。

一旦我有了这个。我意识到这可以推广到所有线性动画,并将其推广到 Behavior/AttachedProperty。

【讨论】:

以上是关于暂停动画旋转,设置角度值,然后稍后恢复?的主要内容,如果未能解决你的问题,请参考以下文章

WPF控制动画开始停止暂停和恢复

旋转动画

如何暂停和恢复动画?

iOS动画暂停和继续

Android 旋转动画怎么动态设置旋转角度,用

Webkit CSS 动画跳跃问题