J'ai une situation où j'ai un modèle 3D qui a une animation de rotation constante. Quand un utilisateur touche l'écran, je voudrais que la rotation s'arrête et que l'utilisateur contrôle l'animation de la rotation.Pause d'une rotation d'animation, réglage de la valeur d'angle, puis reprise plus tard?
J'ai essayé de le faire en mettant l'animation en pause, en définissant la propriété d'angle de la rotation localement, puis en reprenant la rotation. Cependant, j'ai découvert en raison de dependency property precedence, mes valeurs de paramètre sont ignorées pendant que l'animation est en pause.
La seule solution de contournement que je pouvais proposer était d'avoir le contrôle tactile de la caméra, tandis que l'animation contrôle le modèle réel. Malheureusement, cela entraîne d'autres complexités et je préférerais que les deux actions contrôlent le modèle lui-même.
//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();
}