2015-02-08 3 views
2

Я бесконечно переводить анимации применяется к ImageView:Как достичь равномерной скорости во время анимации Перевести?

Animation animation = new TranslateAnimation(0, 0, -500, 500); 
animation.setDuration(4000); 
animation.setFillAfter(false); 
myimage.startAnimation(animation); 
animation.setRepeatCount(Animation.INFINITE); 

То, что я заметил, что процесс перевода происходит медленнее, когда изображение находится рядом с начальной и конечной точкой по сравнению с тем, когда его около половины расстояния (средний пункт).

Я предполагаю, что скорость перевода анимации на андроид не является однородной.

Как сделать скорость равной на протяжении всего процесса?

ответ

3

Я сделал несколько подводных погружений, чтобы исследовать это. Во-первых, отметим, что если линейный интерполятор, используется для обеспечения interpolatedTime значения к applyTransformationTranslateAnimation методом, в результате перевод будет иметь постоянную скорость (из-за смещения dx и dy являются линейными функциями interpolatedTime (строки 149-160)):

@Override 
protected void applyTransformation(float interpolatedTime, Transformation t) { 
    float dx = mFromXDelta; 
    float dy = mFromYDelta; 
    if (mFromXDelta != mToXDelta) { 
     dx = mFromXDelta + ((mToXDelta - mFromXDelta) * interpolatedTime); 
    } 
    if (mFromYDelta != mToYDelta) { 
     dy = mFromYDelta + ((mToYDelta - mFromYDelta) * interpolatedTime); 
    } 
    t.getMatrix().setTranslate(dx, dy); 
} 

applyTransformation вызывается getTransformation метода базового класса Animation (строки 869-870):

... 
final float interpolatedTime = mInterpolator.getInterpolation(normalizedTime); 
applyTransformation(interpolatedTime, outTransformation); 
... 

Согласно документации для setInterpolator метода (строки 382-392), mInterpolator должны по умолчанию линейной интерпол:

/** 
* Sets the acceleration curve for this animation. Defaults to a linear 
* interpolation. 
* 
* @param i The interpolator which defines the acceleration curve 
* @attr ref android.R.styleable#Animation_interpolator 
*/ 
public void setInterpolator(Interpolator i) { 
    mInterpolator = i; 
} 

Однако, это, кажется, неверно: оба конструктора в Animation класса вызовите ensureInterpolator метод (строки 803-811):

/** 
* Gurantees that this animation has an interpolator. Will use 
* a AccelerateDecelerateInterpolator is nothing else was specified. 
*/ 
protected void ensureInterpolator() { 
    if (mInterpolator == null) { 
     mInterpolator = new AccelerateDecelerateInterpolator(); 
    } 
} 

, который предполагает, что интерпол по умолчанию является AccelerateDecelerateInterpolator. Это объясняет поведение, которое вы описываете в своем вопросе.

На самом деле ответить на ваш вопрос, то, казалось бы, что вы должны изменить код следующим образом:

Animation animation = new TranslateAnimation(0, 0, -500, 500); 
animation.setInterpolator(new LinearInterpolator()); 
animation.setDuration(4000); 
animation.setFillAfter(false); 
myimage.startAnimation(animation); 
animation.setRepeatCount(Animation.INFINITE); 
+1

спасибо. Его месяц был только тем, что я кодировал android. Я не знал об этом поведении для скорости. Ваш ответ проясняет мои сомнения, а также я получаю указания, чтобы учиться дальше. –

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

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