Я сделал несколько подводных погружений, чтобы исследовать это. Во-первых, отметим, что если линейный интерполятор, используется для обеспечения interpolatedTime
значения к applyTransformation
TranslateAnimation
методом, в результате перевод будет иметь постоянную скорость (из-за смещения 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);
спасибо. Его месяц был только тем, что я кодировал android. Я не знал об этом поведении для скорости. Ваш ответ проясняет мои сомнения, а также я получаю указания, чтобы учиться дальше. –