summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author John Reck <jreck@google.com> 2014-09-05 15:57:47 -0700
committer John Reck <jreck@google.com> 2014-09-05 15:58:26 -0700
commitf5945a0c8bb868f978d9d0d22043a8b44464a86e (patch)
tree225f4979dc6b8e0290307194fa1ec0c3a48ddcff
parentc237555c6cb89c347acf13eba45b875946473501 (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.java4
-rw-r--r--core/java/android/view/RenderNodeAnimator.java7
-rw-r--r--core/jni/android_view_RenderNodeAnimator.cpp6
-rw-r--r--libs/hwui/Animator.h5
-rw-r--r--libs/hwui/AnimatorManager.cpp3
-rw-r--r--tests/HwAccelerationTest/src/com/android/test/hwui/RevealActivity.java15
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);