2010-09-09 2 views
0

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

Done!

Если вы хотите, чтобы ваша анимация была на постоянной скорости, вам нужно будет учитывать расстояние (Math.Abs(anim.To-anim.From)) при расчете продолжительности.

Как только у меня было это. Я понял, что это может быть обобщено для всех линейных анимаций и обобщено на поведение/AttachedProperty.

Смежные вопросы