暂停动画旋转,设置角度值,然后稍后恢复?
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。
【讨论】:
以上是关于暂停动画旋转,设置角度值,然后稍后恢复?的主要内容,如果未能解决你的问题,请参考以下文章