diff options
author | John Reck <jreck@google.com> | 2014-06-02 11:00:09 -0700 |
---|---|---|
committer | John Reck <jreck@google.com> | 2014-06-02 11:00:09 -0700 |
commit | c6b3264e16f1d2b72e7f9508559981ce9970157c (patch) | |
tree | 4b9b4d78d238e04cdd5c0394b757d88276856d0a | |
parent | 58136d02113ae768dc2cdf871a773bd34cc71583 (diff) | |
download | frameworks_base-c6b3264e16f1d2b72e7f9508559981ce9970157c.zip frameworks_base-c6b3264e16f1d2b72e7f9508559981ce9970157c.tar.gz frameworks_base-c6b3264e16f1d2b72e7f9508559981ce9970157c.tar.bz2 |
Add setStartValue to RNA
Bug: 15198607
Should be good-enough for Ripples to use for pseudo-chaining
support.
Change-Id: Ia8666928ccb69ae401cb583751632a52bd928b63
-rw-r--r-- | core/java/android/view/RenderNodeAnimator.java | 16 | ||||
-rw-r--r-- | core/jni/android_view_RenderNodeAnimator.cpp | 6 | ||||
-rw-r--r-- | libs/hwui/Animator.cpp | 4 | ||||
-rw-r--r-- | libs/hwui/Animator.h | 3 | ||||
-rw-r--r-- | tests/HwAccelerationTest/src/com/android/test/hwui/CirclePropActivity.java | 18 |
5 files changed, 34 insertions, 13 deletions
diff --git a/core/java/android/view/RenderNodeAnimator.java b/core/java/android/view/RenderNodeAnimator.java index e918119..4979059 100644 --- a/core/java/android/view/RenderNodeAnimator.java +++ b/core/java/android/view/RenderNodeAnimator.java @@ -219,6 +219,15 @@ public final class RenderNodeAnimator extends Animator { return mTarget; } + /** + * WARNING: May only be called once!!! + * TODO: Fix above -_- + */ + public void setStartValue(float startValue) { + checkMutable(); + nSetStartValue(mNativePtr.get(), startValue); + } + @Override public void setStartDelay(long startDelay) { checkMutable(); @@ -282,11 +291,12 @@ public final class RenderNodeAnimator extends Animator { } private static native long nCreateAnimator(WeakReference<RenderNodeAnimator> weakThis, - int property, float deltaValue); + int property, float finalValue); private static native long nCreateCanvasPropertyFloatAnimator(WeakReference<RenderNodeAnimator> weakThis, - long canvasProperty, float deltaValue); + long canvasProperty, float finalValue); private static native long nCreateCanvasPropertyPaintAnimator(WeakReference<RenderNodeAnimator> weakThis, - long canvasProperty, int paintField, float deltaValue); + long canvasProperty, int paintField, float finalValue); + private static native void nSetStartValue(long nativePtr, float startValue); private static native void nSetDuration(long nativePtr, long duration); private static native long nGetDuration(long nativePtr); private static native void nSetStartDelay(long nativePtr, long startDelay); diff --git a/core/jni/android_view_RenderNodeAnimator.cpp b/core/jni/android_view_RenderNodeAnimator.cpp index e19ce36..d689864 100644 --- a/core/jni/android_view_RenderNodeAnimator.cpp +++ b/core/jni/android_view_RenderNodeAnimator.cpp @@ -116,6 +116,11 @@ static jlong createCanvasPropertyPaintAnimator(JNIEnv* env, jobject clazz, return reinterpret_cast<jlong>( animator ); } +static void setStartValue(JNIEnv* env, jobject clazz, jlong animatorPtr, jfloat startValue) { + BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr); + animator->setStartValue(startValue); +} + static void setDuration(JNIEnv* env, jobject clazz, jlong animatorPtr, jlong duration) { LOG_ALWAYS_FATAL_IF(duration < 0, "Duration cannot be negative"); BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr); @@ -157,6 +162,7 @@ static JNINativeMethod gMethods[] = { { "nCreateAnimator", "(Ljava/lang/ref/WeakReference;IF)J", (void*) createAnimator }, { "nCreateCanvasPropertyFloatAnimator", "(Ljava/lang/ref/WeakReference;JF)J", (void*) createCanvasPropertyFloatAnimator }, { "nCreateCanvasPropertyPaintAnimator", "(Ljava/lang/ref/WeakReference;JIF)J", (void*) createCanvasPropertyPaintAnimator }, + { "nSetStartValue", "(JF)V", (void*) setStartValue }, { "nSetDuration", "(JJ)V", (void*) setDuration }, { "nGetDuration", "(J)J", (void*) getDuration }, { "nSetStartDelay", "(JJ)V", (void*) setStartDelay }, diff --git a/libs/hwui/Animator.cpp b/libs/hwui/Animator.cpp index b80f7e9..eff3011 100644 --- a/libs/hwui/Animator.cpp +++ b/libs/hwui/Animator.cpp @@ -63,7 +63,6 @@ void BaseRenderNodeAnimator::setStartValue(float value) { void BaseRenderNodeAnimator::setupStartValueIfNecessary(RenderNode* target, TreeInfo& info) { if (mPlayState == NEEDS_START) { setStartValue(getValue(target)); - mPlayState = PENDING; } } @@ -154,7 +153,8 @@ RenderPropertyAnimator::RenderPropertyAnimator(RenderProperty property, float fi } void RenderPropertyAnimator::onAttached(RenderNode* target) { - if (target->isPropertyFieldDirty(mPropertyAccess->dirtyMask)) { + if (mPlayState == NEEDS_START + && target->isPropertyFieldDirty(mPropertyAccess->dirtyMask)) { setStartValue((target->stagingProperties().*mPropertyAccess->getter)()); } (target->mutateStagingProperties().*mPropertyAccess->setter)(finalValue()); diff --git a/libs/hwui/Animator.h b/libs/hwui/Animator.h index 7741617..a0c7c55 100644 --- a/libs/hwui/Animator.h +++ b/libs/hwui/Animator.h @@ -41,6 +41,7 @@ protected: class BaseRenderNodeAnimator : public VirtualLightRefBase { PREVENT_COPY_AND_ASSIGN(BaseRenderNodeAnimator); public: + ANDROID_API void setStartValue(float value); ANDROID_API void setInterpolator(Interpolator* interpolator); ANDROID_API void setDuration(nsecs_t durationInMs); ANDROID_API nsecs_t duration() { return mDuration; } @@ -64,11 +65,9 @@ protected: BaseRenderNodeAnimator(float finalValue); virtual ~BaseRenderNodeAnimator(); - void setStartValue(float value); virtual float getValue(RenderNode* target) const = 0; virtual void setValue(RenderNode* target, float value) = 0; -private: void callOnFinishedListener(TreeInfo& info); enum PlayState { diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/CirclePropActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/CirclePropActivity.java index 5b0aa66..a81e063 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/CirclePropActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/CirclePropActivity.java @@ -118,19 +118,25 @@ public class CirclePropActivity extends Activity { mRadius, mToggle ? 250.0f : 150.0f)); mRunningAnimations.add(new RenderNodeAnimator( - mPaint, RenderNodeAnimator.PAINT_ALPHA, - mToggle ? 64.0f : 255.0f)); - - mRunningAnimations.add(new RenderNodeAnimator( mPaint, RenderNodeAnimator.PAINT_STROKE_WIDTH, mToggle ? 5.0f : 60.0f)); - TimeInterpolator interp = new OvershootInterpolator(3.0f); + mRunningAnimations.add(new RenderNodeAnimator( + mPaint, RenderNodeAnimator.PAINT_ALPHA, 64.0f)); + + // Will be "chained" to run after the above + mRunningAnimations.add(new RenderNodeAnimator( + mPaint, RenderNodeAnimator.PAINT_ALPHA, 255.0f)); + for (int i = 0; i < mRunningAnimations.size(); i++) { RenderNodeAnimator anim = mRunningAnimations.get(i); - anim.setInterpolator(interp); anim.setDuration(1000); anim.setTarget(this); + if (i == (mRunningAnimations.size() - 1)) { + // "chain" test + anim.setStartValue(64.0f); + anim.setStartDelay(anim.getDuration()); + } anim.start(); } |