diff options
| author | 2016-06-15 19:04:36 -0700 | |
|---|---|---|
| committer | 2016-06-16 22:09:44 +0000 | |
| commit | 126df850ce6b5f8a355534eb09235e22995f0116 (patch) | |
| tree | 2390277f7509c38916dea6d2a8e45672bbd3566a | |
| parent | 2f75cf4bb5b2d54f8f7e878a8454efee58f556c7 (diff) | |
Support AVD animation falling back on UI thread
AVD will fall back to UI thread animation if the host view is
rendering onto a SW layer.
BUG: 27617346
Change-Id: I5b644529048a0c30aada3abf2f4e95e40760936d
| -rw-r--r-- | graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java index 6bb93aec49b9..0bdc76f9f359 100644 --- a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java @@ -239,6 +239,17 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 { @Override public void draw(Canvas canvas) { + if (!canvas.isHardwareAccelerated() && mAnimatorSet instanceof VectorDrawableAnimatorRT) { + // If we have SW canvas and the RT animation is waiting to start, We need to fallback + // to UI thread animation for AVD. + if (!mAnimatorSet.isRunning() && + ((VectorDrawableAnimatorRT) mAnimatorSet).mPendingAnimationActions.size() > 0) { + VectorDrawableAnimatorRT oldAnim = (VectorDrawableAnimatorRT) mAnimatorSet; + mAnimatorSet = new VectorDrawableAnimatorUI(this); + mAnimatorSet.init(mAnimatorSetFromXml); + oldAnim.transferPendingActions(mAnimatorSet); + } + } mAnimatorSet.onDraw(canvas); mAnimatedVectorState.mVectorDrawable.draw(canvas); } @@ -1590,6 +1601,25 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 { private static void callOnFinished(VectorDrawableAnimatorRT set, int id) { set.onAnimationEnd(id); } + + private void transferPendingActions(VectorDrawableAnimator animatorSet) { + for (int i = 0; i < mPendingAnimationActions.size(); i++) { + int pendingAction = mPendingAnimationActions.get(i); + if (pendingAction == START_ANIMATION) { + animatorSet.start(); + } else if (pendingAction == END_ANIMATION) { + animatorSet.end(); + } else if (pendingAction == REVERSE_ANIMATION) { + animatorSet.reverse(); + } else if (pendingAction == RESET_ANIMATION) { + animatorSet.reset(); + } else { + throw new UnsupportedOperationException("Animation action " + + pendingAction + "is not supported"); + } + } + mPendingAnimationActions.clear(); + } } private static native long nCreateAnimatorSet(); |