У меня есть ситуация, когда у меня есть 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();
}