diff options
| author | 2014-09-05 15:57:47 -0700 | |
|---|---|---|
| committer | 2014-09-05 15:58:26 -0700 | |
| commit | f5945a0c8bb868f978d9d0d22043a8b44464a86e (patch) | |
| tree | 225f4979dc6b8e0290307194fa1ec0c3a48ddcff | |
| parent | c237555c6cb89c347acf13eba45b875946473501 (diff) | |
Disable RT-anim for AnimatorSet
Bug: 17317184
Unfortunately this will disable *all* RT animations in a scene,
but we don't have more selective targetting currently
Change-Id: I57e1c0ae43957f45229473bdcdaf34c05825fab7
| -rw-r--r-- | core/java/android/animation/AnimatorSet.java | 4 | ||||
| -rw-r--r-- | core/java/android/view/RenderNodeAnimator.java | 7 | ||||
| -rw-r--r-- | core/jni/android_view_RenderNodeAnimator.cpp | 6 | ||||
| -rw-r--r-- | libs/hwui/Animator.h | 5 | ||||
| -rw-r--r-- | libs/hwui/AnimatorManager.cpp | 3 | ||||
| -rw-r--r-- | tests/HwAccelerationTest/src/com/android/test/hwui/RevealActivity.java | 15 |
6 files changed, 37 insertions, 3 deletions
diff --git a/core/java/android/animation/AnimatorSet.java b/core/java/android/animation/AnimatorSet.java index 9156eebe538f..7c13dbe07f75 100644 --- a/core/java/android/animation/AnimatorSet.java +++ b/core/java/android/animation/AnimatorSet.java @@ -504,6 +504,10 @@ public final class AnimatorSet extends Animator { mStarted = true; mPaused = false; + for (Node node : mNodes) { + node.animation.setAllowRunningAsynchronously(false); + } + if (mDuration >= 0) { // If the duration was set on this AnimatorSet, pass it along to all child animations for (Node node : mNodes) { diff --git a/core/java/android/view/RenderNodeAnimator.java b/core/java/android/view/RenderNodeAnimator.java index fa4a13a8f8e3..debf45de0a4f 100644 --- a/core/java/android/view/RenderNodeAnimator.java +++ b/core/java/android/view/RenderNodeAnimator.java @@ -453,6 +453,12 @@ public class RenderNodeAnimator extends Animator { throw new IllegalStateException("Cannot clone this animator"); } + @Override + public void setAllowRunningAsynchronously(boolean mayRunAsync) { + checkMutable(); + nSetAllowRunningAsync(mNativePtr.get(), mayRunAsync); + } + private static native long nCreateAnimator(int property, float finalValue); private static native long nCreateCanvasPropertyFloatAnimator( long canvasProperty, float finalValue); @@ -466,6 +472,7 @@ public class RenderNodeAnimator extends Animator { private static native long nGetDuration(long nativePtr); private static native void nSetStartDelay(long nativePtr, long startDelay); private static native void nSetInterpolator(long animPtr, long interpolatorPtr); + private static native void nSetAllowRunningAsync(long animPtr, boolean mayRunAsync); private static native void nStart(long animPtr, RenderNodeAnimator finishListener); private static native void nEnd(long animPtr); diff --git a/core/jni/android_view_RenderNodeAnimator.cpp b/core/jni/android_view_RenderNodeAnimator.cpp index 85c2a09a2c9e..84b7913a5462 100644 --- a/core/jni/android_view_RenderNodeAnimator.cpp +++ b/core/jni/android_view_RenderNodeAnimator.cpp @@ -159,6 +159,11 @@ static void setInterpolator(JNIEnv* env, jobject clazz, jlong animatorPtr, jlong animator->setInterpolator(interpolator); } +static void setAllowRunningAsync(JNIEnv* env, jobject clazz, jlong animatorPtr, jboolean mayRunAsync) { + BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr); + animator->setAllowRunningAsync(mayRunAsync); +} + static void start(JNIEnv* env, jobject clazz, jlong animatorPtr, jobject finishListener) { BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr); if (finishListener) { @@ -191,6 +196,7 @@ static JNINativeMethod gMethods[] = { { "nGetDuration", "(J)J", (void*) getDuration }, { "nSetStartDelay", "(JJ)V", (void*) setStartDelay }, { "nSetInterpolator", "(JJ)V", (void*) setInterpolator }, + { "nSetAllowRunningAsync", "(JZ)V", (void*) setAllowRunningAsync }, { "nStart", "(JLandroid/view/RenderNodeAnimator;)V", (void*) start }, { "nEnd", "(J)V", (void*) end }, #endif diff --git a/libs/hwui/Animator.h b/libs/hwui/Animator.h index 1ab6235bb2d7..35a4a09c287f 100644 --- a/libs/hwui/Animator.h +++ b/libs/hwui/Animator.h @@ -53,6 +53,10 @@ public: mListener = listener; } AnimationListener* listener() { return mListener.get(); } + ANDROID_API void setAllowRunningAsync(bool mayRunAsync) { + mMayRunAsync = mayRunAsync; + } + bool mayRunAsync() { return mMayRunAsync; } ANDROID_API void start() { mStagingPlayState = RUNNING; onStagingPlayStateChanged(); } ANDROID_API void end() { mStagingPlayState = FINISHED; onStagingPlayStateChanged(); } @@ -101,6 +105,7 @@ protected: nsecs_t mStartTime; nsecs_t mDuration; nsecs_t mStartDelay; + bool mMayRunAsync; sp<AnimationListener> mListener; diff --git a/libs/hwui/AnimatorManager.cpp b/libs/hwui/AnimatorManager.cpp index e06d80044f4c..c28fb88a0361 100644 --- a/libs/hwui/AnimatorManager.cpp +++ b/libs/hwui/AnimatorManager.cpp @@ -90,6 +90,9 @@ public: if (animator->isRunning()) { mInfo.out.hasAnimations = true; } + if (CC_UNLIKELY(!animator->mayRunAsync())) { + mInfo.out.requiresUiRedraw = true; + } } return remove; } diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/RevealActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/RevealActivity.java index 3360e3036205..256a1d4c2dcc 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/RevealActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/RevealActivity.java @@ -17,6 +17,7 @@ package com.android.test.hwui; import android.animation.Animator; +import android.animation.AnimatorSet; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; @@ -34,6 +35,7 @@ public class RevealActivity extends Activity implements OnClickListener { private static final int DURATION = 800; private boolean mShouldBlock; + private int mIteration = 0; @Override protected void onCreate(Bundle savedInstanceState) { @@ -57,10 +59,17 @@ public class RevealActivity extends Activity implements OnClickListener { Animator animator = ViewAnimationUtils.createCircularReveal(view, view.getWidth() / 2, view.getHeight() / 2, 0, Math.max(view.getWidth(), view.getHeight())); - animator.setDuration(DURATION); - animator.setAllowRunningAsynchronously(true); - animator.start(); + if (mIteration < 2) { + animator.setDuration(DURATION); + animator.start(); + } else { + AnimatorSet set = new AnimatorSet(); + set.playTogether(animator); + set.setDuration(DURATION); + set.start(); + } + mIteration = (mIteration + 1) % 4; mShouldBlock = !mShouldBlock; if (mShouldBlock) { view.post(sBlockThread); |