diff options
| author | 2016-01-19 13:11:08 +0000 | |
|---|---|---|
| committer | 2016-01-19 18:31:06 +0000 | |
| commit | c92d70dff716a8b38982b3d6ec05427ad66497fa (patch) | |
| tree | ffe91e720f8a0640e6eccc92155b094ba1137d07 | |
| parent | b9c48d8f49d35e2682c7205a9d8d5fcc25d7c736 (diff) | |
Deals with android:rotation attribute in layoutlib
The way Android views deal with their rotation xml attribute is through
native code called for hardware accelerated rendering. So layoutlib
has to bypass that in order to take those attributes into account.
Bug: http://b.android.com/73300
Change-Id: Ieb5bf0567a25a9021491ebf3250cedd0752f7863
| -rw-r--r-- | tools/layoutlib/bridge/src/android/view/RenderNode_Delegate.java | 150 | ||||
| -rw-r--r-- | tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java | 13 |
2 files changed, 163 insertions, 0 deletions
diff --git a/tools/layoutlib/bridge/src/android/view/RenderNode_Delegate.java b/tools/layoutlib/bridge/src/android/view/RenderNode_Delegate.java index 6c949d9dcd4e..d62d4e1992df 100644 --- a/tools/layoutlib/bridge/src/android/view/RenderNode_Delegate.java +++ b/tools/layoutlib/bridge/src/android/view/RenderNode_Delegate.java @@ -19,6 +19,8 @@ package android.view; import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.tools.layoutlib.annotations.LayoutlibDelegate; +import android.graphics.Matrix; + /** * Delegate implementing the native methods of {@link RenderNode} * <p/> @@ -36,6 +38,14 @@ public class RenderNode_Delegate { private float mLift; + private float mRotation; + private float mPivotX; + private float mPivotY; + private boolean mPivotExplicitelySet; + private int mLeft; + private int mRight; + private int mTop; + private int mBottom; @SuppressWarnings("UnusedDeclaration") private String mName; @@ -69,4 +79,144 @@ public class RenderNode_Delegate { } return 0f; } + + @LayoutlibDelegate + /*package*/ static boolean nSetRotation(long renderNode, float rotation) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null && delegate.mRotation != rotation) { + delegate.mRotation = rotation; + return true; + } + return false; + } + + @LayoutlibDelegate + /*package*/ static float nGetRotation(long renderNode) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null) { + return delegate.mRotation; + } + return 0f; + } + + @LayoutlibDelegate + /*package*/ static void getMatrix(RenderNode renderNode, Matrix outMatrix) { + outMatrix.reset(); + if (renderNode != null) { + outMatrix.preRotate(renderNode.getRotation(), renderNode.getPivotX(), + renderNode.getPivotY()); + } + } + + @LayoutlibDelegate + /*package*/ static boolean nSetLeft(long renderNode, int left) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null && delegate.mLeft != left) { + delegate.mLeft = left; + return true; + } + return false; + } + + @LayoutlibDelegate + /*package*/ static boolean nSetTop(long renderNode, int top) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null && delegate.mTop != top) { + delegate.mTop = top; + return true; + } + return false; + } + + @LayoutlibDelegate + /*package*/ static boolean nSetRight(long renderNode, int right) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null && delegate.mRight != right) { + delegate.mRight = right; + return true; + } + return false; + } + + @LayoutlibDelegate + /*package*/ static boolean nSetBottom(long renderNode, int bottom) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null && delegate.mBottom != bottom) { + delegate.mBottom = bottom; + return true; + } + return false; + } + + @LayoutlibDelegate + /*package*/ static boolean nSetLeftTopRightBottom(long renderNode, int left, int top, int right, + int bottom) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null && (delegate.mLeft != left || delegate.mTop != top || delegate + .mRight != right || delegate.mBottom != bottom)) { + delegate.mLeft = left; + delegate.mTop = top; + delegate.mRight = right; + delegate.mBottom = bottom; + return true; + } + return false; + } + + @LayoutlibDelegate + /*package*/ static boolean nIsPivotExplicitlySet(long renderNode) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null) { + return delegate.mPivotExplicitelySet; + } + return false; + } + + @LayoutlibDelegate + /*package*/ static boolean nSetPivotX(long renderNode, float pivotX) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null && delegate.mPivotX != pivotX) { + delegate.mPivotX = pivotX; + delegate.mPivotExplicitelySet = true; + return true; + } + return false; + } + + @LayoutlibDelegate + /*package*/ static float nGetPivotX(long renderNode) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null) { + if (delegate.mPivotExplicitelySet) { + return delegate.mPivotX; + } else { + return (delegate.mRight - delegate.mLeft) / 2.0f; + } + } + return 0f; + } + + @LayoutlibDelegate + /*package*/ static boolean nSetPivotY(long renderNode, float pivotY) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null && delegate.mPivotY != pivotY) { + delegate.mPivotY = pivotY; + delegate.mPivotExplicitelySet = true; + return true; + } + return false; + } + + @LayoutlibDelegate + /*package*/ static float nGetPivotY(long renderNode) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null) { + if (delegate.mPivotExplicitelySet) { + return delegate.mPivotY; + } else { + return (delegate.mBottom - delegate.mTop) / 2.0f; + } + } + return 0f; + } } diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java index 558a914c7692..3952e1bd4817 100644 --- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java +++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java @@ -192,6 +192,19 @@ public final class CreateInfo implements ICreateInfo { "android.view.RenderNode#nDestroyRenderNode", "android.view.RenderNode#nSetElevation", "android.view.RenderNode#nGetElevation", + "android.view.RenderNode#nSetRotation", + "android.view.RenderNode#nGetRotation", + "android.view.RenderNode#getMatrix", + "android.view.RenderNode#nSetLeft", + "android.view.RenderNode#nSetTop", + "android.view.RenderNode#nSetRight", + "android.view.RenderNode#nSetBottom", + "android.view.RenderNode#nSetLeftTopRightBottom", + "android.view.RenderNode#nSetPivotX", + "android.view.RenderNode#nGetPivotX", + "android.view.RenderNode#nSetPivotY", + "android.view.RenderNode#nGetPivotY", + "android.view.RenderNode#nIsPivotExplicitlySet", "android.view.ViewGroup#drawChild", "android.widget.SimpleMonthView#getTitle", "android.widget.SimpleMonthView#getDayOfWeekLabel", |