summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt1
-rw-r--r--core/java/android/view/View.java17
-rw-r--r--core/jni/android_view_RenderNode.cpp14
-rw-r--r--graphics/java/android/graphics/RenderNode.java28
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