Loading core/java/android/view/RenderNodeAnimator.java +13 −3 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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); Loading core/jni/android_view_RenderNodeAnimator.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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 }, Loading libs/hwui/Animator.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -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; } } Loading Loading @@ -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()); Loading libs/hwui/Animator.h +1 −2 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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 { Loading tests/HwAccelerationTest/src/com/android/test/hwui/CirclePropActivity.java +12 −6 Original line number Diff line number Diff line Loading @@ -117,20 +117,26 @@ public class CirclePropActivity extends Activity { mRunningAnimations.add(new RenderNodeAnimator( 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(); } Loading Loading
core/java/android/view/RenderNodeAnimator.java +13 −3 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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); Loading
core/jni/android_view_RenderNodeAnimator.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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 }, Loading
libs/hwui/Animator.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -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; } } Loading Loading @@ -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()); Loading
libs/hwui/Animator.h +1 −2 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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 { Loading
tests/HwAccelerationTest/src/com/android/test/hwui/CirclePropActivity.java +12 −6 Original line number Diff line number Diff line Loading @@ -117,20 +117,26 @@ public class CirclePropActivity extends Activity { mRunningAnimations.add(new RenderNodeAnimator( 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(); } Loading