2012-07-04 1 views
0

У меня есть анимация внутри Поведения, но она не работает.Как получить жидкую анимацию с раскадровкой

Вот мой код анимации:

DoubleAnimationUsingKeyFrames animation = new DoubleAnimationUsingKeyFrames(); 

animation.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("(0).(1)", UIElement.RenderTransformProperty, RotateTransform.AngleProperty)); 

int keyFrameCount = 16; 
double timeOffsetInSeconds = 0.1; 
int targetValue = 12; 

double totalAnimationLength = keyFrameCount * timeOffsetInSeconds; 
double repeatInterval = RepeatInterval; 
bool isShaking = IsShaking; 

// Can't be less than zero and pointless to be less than total length 
if (repeatInterval < totalAnimationLength) 
    repeatInterval = totalAnimationLength; 

animation.Duration = new Duration(TimeSpan.FromSeconds(repeatInterval)); 

for (int i = 0; i < keyFrameCount; i++) 
{ 
    animation.KeyFrames.Add(new LinearDoubleKeyFrame(i % 2 == 0 ? targetValue : -targetValue, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(i * timeOffsetInSeconds)))); 
} 

animation.KeyFrames.Add(new LinearDoubleKeyFrame(0, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(totalAnimationLength)))); 

Но, если я выбираю

int keyFrameCount = 360; 

и

for (int i = 0; i < keyFrameCount; i++) 
{ 
    animation.KeyFrames.Add(new LinearDoubleKeyFrame(i, keyTime.FromTimeSpan(TimeSpan.FromSeconds(i * timeOffsetInSeconds)))); 
} 

он будет вращаться очень гладкий круг.

Как добиться того, чтобы анимация проходила от 0 до 30 градусов, назад до -30 градусов, , а затем назад к 0 (чтобы немного свернуть). И пусть он выглядит бегло.

После некоторых попыток, я вижу, что (нормальный) взад и вперед не будет работать здесь, он ведет себя совершенно неконтролируемым!

ответ

2

Я не совсем уверен, почему вы делаете так много ключевых кадров самостоятельно, но для того, чтобы сделать

Как я могу добиться, чтобы анимация идти от 0 до 30 градусов, обратно до -30 градусы, а затем обратно на 0 (чтобы немного смять) И пусть он выглядит бегло.

Вы можете изменить анимацию, чтобы что-то вроде

DoubleAnimationUsingKeyFrames animation = new DoubleAnimationUsingKeyFrames(); 

animation.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("(0).(1)", UIElement.RenderTransformProperty, RotateTransform.AngleProperty)); 

var totalAnimationLength = 1600; // Milliseconds 

double repeatInterval = 1600;// Milliseconds 

if (repeatInterval < totalAnimationLength) repeatInterval = totalAnimationLength; // Can't be less than zero and pointless to be less than total length 

animation.Duration = new Duration(TimeSpan.FromMilliseconds(repeatInterval)); 
animation.RepeatBehavior = RepeatBehavior.Forever; // assuming this was intended from having a repeat interval? 

animation.KeyFrames.Add(new LinearDoubleKeyFrame(30, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(totalAnimationLength * 0.25)))); 
animation.KeyFrames.Add(new LinearDoubleKeyFrame(-30, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(totalAnimationLength * 0.75)))); 
animation.KeyFrames.Add(new LinearDoubleKeyFrame(0, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(totalAnimationLength)))); 
+0

отлично работает! Большое спасибо! –

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

  • Нет связанных вопросов^_^