Merge "Avoid calling invalidateSelf() from draw call"

This commit is contained in:
Doris Liu
2016-01-05 00:54:36 +00:00
committed by Android (Google) Code Review

View File

@@ -19,6 +19,7 @@ import android.animation.AnimatorInflater;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.Animator.AnimatorListener;
import android.animation.ValueAnimator;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.res.ColorStateList;
@@ -140,6 +141,15 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 {
/** Local, mutable animator set. */
private final AnimatorSet mAnimatorSet = new AnimatorSet();
private final ValueAnimator.AnimatorUpdateListener mUpdateListener =
new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
invalidateSelf();
}
};
/**
* The resources against which this drawable was created. Used to attempt
* to inflate animators if applyTheme() doesn't get called.
@@ -201,9 +211,6 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 {
@Override
public void draw(Canvas canvas) {
mAnimatedVectorState.mVectorDrawable.draw(canvas);
if (isStarted()) {
invalidateSelf();
}
}
@Override
@@ -486,6 +493,7 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 {
* animators, or {@code null} if not available
*/
public void prepareLocalAnimators(@NonNull AnimatorSet animatorSet,
@NonNull ValueAnimator.AnimatorUpdateListener updateListener,
@Nullable Resources res) {
// Check for uninflated animators. We can remove this after we add
// support for Animator.applyTheme(). See comments in inflate().
@@ -511,6 +519,17 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 {
final Animator nextAnim = prepareLocalAnimator(i);
builder.with(nextAnim);
}
// Setup a value animator to get animation update callbacks.
long totalDuration = animatorSet.getTotalDuration();
ValueAnimator updateAnim = ValueAnimator.ofFloat(0f, 1f);
if (totalDuration == ValueAnimator.DURATION_INFINITE) {
updateAnim.setRepeatCount(ValueAnimator.INFINITE);
} else {
updateAnim.setDuration(totalDuration);
}
updateAnim.addUpdateListener(updateListener);
builder.with(updateAnim);
}
}
@@ -603,7 +622,7 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 {
@NonNull
private void ensureAnimatorSet() {
if (!mHasAnimatorSet) {
mAnimatedVectorState.prepareLocalAnimators(mAnimatorSet, mRes);
mAnimatedVectorState.prepareLocalAnimators(mAnimatorSet, mUpdateListener, mRes);
mHasAnimatorSet = true;
mRes = null;
}