Принятый ответ не сработал для меня.Нужно «плавное» продолжение текущей анимации без сбоев.Вместо этого я немного изменил класс RotationAnimation, чтобы вернуть «используемые в данный момент» градусы, которые затем можно использовать:
/**
* Allows you to fetch the currently 'used' animation degrees so you can create a new animator
* out of it, allowing smooth animation
*/
class AdjustableRotationAnimation extends Animation {
private float mFromDegrees;
private float mToDegrees;
private volatile float mAnimatedDegrees;
private int mPivotXType = ABSOLUTE;
private int mPivotYType = ABSOLUTE;
private float mPivotXValue = 0.0f;
private float mPivotYValue = 0.0f;
private float mPivotX;
private float mPivotY;
public AdjustableRotationAnimation(Context context, AttributeSet attrs) {
super(context, attrs);
}
public AdjustableRotationAnimation(float fromDegrees, float toDegrees) {
mFromDegrees = fromDegrees;
mToDegrees = toDegrees;
mPivotX = 0.0f;
mPivotY = 0.0f;
}
public AdjustableRotationAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY) {
mFromDegrees = fromDegrees;
mToDegrees = toDegrees;
mPivotXType = ABSOLUTE;
mPivotYType = ABSOLUTE;
mPivotXValue = pivotX;
mPivotYValue = pivotY;
}
public AdjustableRotationAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue,
int pivotYType, float pivotYValue) {
mFromDegrees = fromDegrees;
mToDegrees = toDegrees;
mPivotXValue = pivotXValue;
mPivotXType = pivotXType;
mPivotYValue = pivotYValue;
mPivotYType = pivotYType;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
mAnimatedDegrees = mFromDegrees + ((mToDegrees - mFromDegrees) * interpolatedTime);
float scale = getScaleFactor();
if (mPivotX == 0.0f && mPivotY == 0.0f) {
t.getMatrix().setRotate(mAnimatedDegrees);
} else {
t.getMatrix().setRotate(mAnimatedDegrees, mPivotX * scale, mPivotY * scale);
}
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
mPivotX = resolveSize(mPivotXType, mPivotXValue, width, parentWidth);
mPivotY = resolveSize(mPivotYType, mPivotYValue, height, parentHeight);
}
public synchronized float getAnimatedDegrees() {
return mAnimatedDegrees;
}
}
И вот как я его использую:
currentRotate = currentRotate % DEGREES_360;
int animationDuration = 400;
if (rotateAnimation != null && !rotateAnimation.hasEnded()) {
rotateAnimation = new AdjustableRotationAnimation(rotateAnimation.getAnimatedDegrees(), currentRotate, Animation.RELATIVE_TO_SELF, CENTER, Animation.RELATIVE_TO_SELF, CENTER);
rotateAnimation.setInterpolator(new DecelerateInterpolator());
rotateAnimation.setDuration(animationDuration);
rotateAnimation.setFillAfter(true);
rotateAnimation.setAnimationListener(this);
} else {
rotateAnimation = new AdjustableRotationAnimation(lastRotation, currentRotate, Animation.RELATIVE_TO_SELF, CENTER, Animation.RELATIVE_TO_SELF, CENTER);
rotateAnimation.setInterpolator(new DecelerateInterpolator());
rotateAnimation.setDuration(animationDuration);
rotateAnimation.setFillAfter(true);
rotateAnimation.setAnimationListener(this);
}
viewToRotate.startAnimation(rotateAnimation);
Это будетсоздайте новую анимацию каждый раз, однако это даст ощущение продолжения, и анимация будет плавно продолжаться с того места, где она была «отменена».