diff options
| -rw-r--r-- | api/current.txt | 1 | ||||
| -rw-r--r-- | core/java/android/view/View.java | 17 | ||||
| -rw-r--r-- | core/jni/android_view_RenderNode.cpp | 14 | ||||
| -rw-r--r-- | graphics/java/android/graphics/RenderNode.java | 28 |
4 files changed, 59 insertions, 1 deletions
diff --git a/api/current.txt b/api/current.txt index f0b491a548fb..5e0f996c166f 100644 --- a/api/current.txt +++ b/api/current.txt @@ -50355,6 +50355,7 @@ package android.view { method @IdRes public int getAccessibilityTraversalBefore(); method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getAlpha(); method public android.view.animation.Animation getAnimation(); + method @Nullable public android.graphics.Matrix getAnimationMatrix(); method public android.os.IBinder getApplicationWindowToken(); method @NonNull public int[] getAttributeResolutionStack(@AttrRes int); method @NonNull public java.util.Map<java.lang.Integer,java.lang.Integer> getAttributeSourceResourceMap(); diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 7fcce6dffb63..b857f1ed9996 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -17197,6 +17197,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * and {@link #setTranslationY(float)} (float)}} instead. * * @param matrix The matrix, null indicates that the matrix should be cleared. + * @see #getAnimationMatrix() */ public void setAnimationMatrix(@Nullable Matrix matrix) { invalidateViewProperty(true, false); @@ -17207,6 +17208,22 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * Return the current transformation matrix of the view. This is used in animation frameworks, + * such as {@link android.transition.Transition}. Returns <code>null</code> when there is no + * transformation provided by {@link #setAnimationMatrix(Matrix)}. + * Application developers should use transformation methods like {@link #setRotation(float)}, + * {@link #setScaleX(float)}, {@link #setScaleX(float)}, {@link #setTranslationX(float)}} + * and {@link #setTranslationY(float)} (float)}} instead. + * + * @return the Matrix, null indicates there is no transformation + * @see #setAnimationMatrix(Matrix) + */ + @Nullable + public Matrix getAnimationMatrix() { + return mRenderNode.getAnimationMatrix(); + } + + /** * Returns the current StateListAnimator if exists. * * @return StateListAnimator or null if it does not exists diff --git a/core/jni/android_view_RenderNode.cpp b/core/jni/android_view_RenderNode.cpp index ce5512ba366a..9f9fbf9eb26d 100644 --- a/core/jni/android_view_RenderNode.cpp +++ b/core/jni/android_view_RenderNode.cpp @@ -338,6 +338,19 @@ static jboolean android_view_RenderNode_hasOverlappingRendering(jlong renderNode return renderNode->stagingProperties().hasOverlappingRendering(); } +static jboolean android_view_RenderNode_getAnimationMatrix(jlong renderNodePtr, jlong outMatrixPtr) { + RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); + SkMatrix* outMatrix = reinterpret_cast<SkMatrix*>(outMatrixPtr); + + const SkMatrix* animationMatrix = renderNode->stagingProperties().getAnimationMatrix(); + + if (animationMatrix) { + *outMatrix = *animationMatrix; + return JNI_TRUE; + } + return JNI_FALSE; +} + static jboolean android_view_RenderNode_getClipToBounds(jlong renderNodePtr) { RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); return renderNode->stagingProperties().getClipToBounds(); @@ -649,6 +662,7 @@ static const JNINativeMethod gMethods[] = { { "nSetLayerPaint", "(JJ)Z", (void*) android_view_RenderNode_setLayerPaint }, { "nSetStaticMatrix", "(JJ)Z", (void*) android_view_RenderNode_setStaticMatrix }, { "nSetAnimationMatrix", "(JJ)Z", (void*) android_view_RenderNode_setAnimationMatrix }, + { "nGetAnimationMatrix", "(JJ)Z", (void*) android_view_RenderNode_getAnimationMatrix }, { "nSetClipToBounds", "(JZ)Z", (void*) android_view_RenderNode_setClipToBounds }, { "nGetClipToBounds", "(J)Z", (void*) android_view_RenderNode_getClipToBounds }, { "nSetClipBounds", "(JIIII)Z", (void*) android_view_RenderNode_setClipBounds }, diff --git a/graphics/java/android/graphics/RenderNode.java b/graphics/java/android/graphics/RenderNode.java index 5e48ea1c98d8..760f83baec9b 100644 --- a/graphics/java/android/graphics/RenderNode.java +++ b/graphics/java/android/graphics/RenderNode.java @@ -808,14 +808,37 @@ public final class RenderNode { * for the matrix parameter. * * @param matrix The matrix, null indicates that the matrix should be cleared. + * @see #getAnimationMatrix() + * * @hide TODO Do we want this? */ - public boolean setAnimationMatrix(Matrix matrix) { + public boolean setAnimationMatrix(@Nullable Matrix matrix) { return nSetAnimationMatrix(mNativeRenderNode, (matrix != null) ? matrix.native_instance : 0); } /** + * Returns the previously set Animation matrix. This matrix exists if an Animation is + * currently playing on a View, and is set on the display list during at draw() time. + * Returns <code>null</code> when there is no transformation provided by + * {@link #setAnimationMatrix(Matrix)}. + * + * @return the current Animation matrix. + * @see #setAnimationMatrix(Matrix) + * + * @hide + */ + @Nullable + public Matrix getAnimationMatrix() { + Matrix output = new Matrix(); + if (nGetAnimationMatrix(mNativeRenderNode, output.native_instance)) { + return output; + } else { + return null; + } + } + + /** * Sets the translucency level for the display list. * * @param alpha The translucency of the display list, must be a value between 0.0f and 1.0f @@ -1660,6 +1683,9 @@ public final class RenderNode { private static native boolean nHasOverlappingRendering(long renderNode); @CriticalNative + private static native boolean nGetAnimationMatrix(long renderNode, long animationMatrix); + + @CriticalNative private static native boolean nGetClipToOutline(long renderNode); @CriticalNative |