From ded4d14e3348ebb0cdfa3498a53d3fbfc58b2043 Mon Sep 17 00:00:00 2001 From: Jerome Gaillard Date: Thu, 21 Jan 2016 11:21:47 +0000 Subject: [PATCH] Deals with translation and scaling in layoutlib Layoutlib now correctly interprets the translation and scaling xml attributes of views, by implementing what the Android platform does in native code. Change-Id: Ie8465f40ef4508d3c31796200800f12cb8f883a4 --- .../src/android/view/RenderNode_Delegate.java | 132 +++++++++++++++++++-- .../android/tools/layoutlib/create/CreateInfo.java | 10 ++ 2 files changed, 129 insertions(+), 13 deletions(-) diff --git a/tools/layoutlib/bridge/src/android/view/RenderNode_Delegate.java b/tools/layoutlib/bridge/src/android/view/RenderNode_Delegate.java index d62d4e1992df..1465f5089599 100644 --- a/tools/layoutlib/bridge/src/android/view/RenderNode_Delegate.java +++ b/tools/layoutlib/bridge/src/android/view/RenderNode_Delegate.java @@ -38,10 +38,15 @@ public class RenderNode_Delegate { private float mLift; + private float mTranslationX; + private float mTranslationY; + private float mTranslationZ; private float mRotation; + private float mScaleX = 1; + private float mScaleY = 1; private float mPivotX; private float mPivotY; - private boolean mPivotExplicitelySet; + private boolean mPivotExplicitlySet; private int mLeft; private int mRight; private int mTop; @@ -81,6 +86,63 @@ public class RenderNode_Delegate { } @LayoutlibDelegate + /*package*/ static boolean nSetTranslationX(long renderNode, float translationX) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null && delegate.mTranslationX != translationX) { + delegate.mTranslationX = translationX; + return true; + } + return false; + } + + @LayoutlibDelegate + /*package*/ static float nGetTranslationX(long renderNode) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null) { + return delegate.mTranslationX; + } + return 0f; + } + + @LayoutlibDelegate + /*package*/ static boolean nSetTranslationY(long renderNode, float translationY) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null && delegate.mTranslationY != translationY) { + delegate.mTranslationY = translationY; + return true; + } + return false; + } + + @LayoutlibDelegate + /*package*/ static float nGetTranslationY(long renderNode) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null) { + return delegate.mTranslationY; + } + return 0f; + } + + @LayoutlibDelegate + /*package*/ static boolean nSetTranslationZ(long renderNode, float translationZ) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null && delegate.mTranslationZ != translationZ) { + delegate.mTranslationZ = translationZ; + return true; + } + return false; + } + + @LayoutlibDelegate + /*package*/ static float nGetTranslationZ(long renderNode) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null) { + return delegate.mTranslationZ; + } + return 0f; + } + + @LayoutlibDelegate /*package*/ static boolean nSetRotation(long renderNode, float rotation) { RenderNode_Delegate delegate = sManager.getDelegate(renderNode); if (delegate != null && delegate.mRotation != rotation) { @@ -103,8 +165,17 @@ public class RenderNode_Delegate { /*package*/ static void getMatrix(RenderNode renderNode, Matrix outMatrix) { outMatrix.reset(); if (renderNode != null) { - outMatrix.preRotate(renderNode.getRotation(), renderNode.getPivotX(), - renderNode.getPivotY()); + float rotation = renderNode.getRotation(); + float translationX = renderNode.getTranslationX(); + float translationY = renderNode.getTranslationY(); + float pivotX = renderNode.getPivotX(); + float pivotY = renderNode.getPivotY(); + float scaleX = renderNode.getScaleX(); + float scaleY = renderNode.getScaleY(); + + outMatrix.setTranslate(translationX, translationY); + outMatrix.preRotate(rotation, pivotX, pivotY); + outMatrix.preScale(scaleX, scaleY, pivotX, pivotY); } } @@ -166,18 +237,15 @@ public class RenderNode_Delegate { @LayoutlibDelegate /*package*/ static boolean nIsPivotExplicitlySet(long renderNode) { RenderNode_Delegate delegate = sManager.getDelegate(renderNode); - if (delegate != null) { - return delegate.mPivotExplicitelySet; - } - return false; + return delegate != null && delegate.mPivotExplicitlySet; } @LayoutlibDelegate /*package*/ static boolean nSetPivotX(long renderNode, float pivotX) { RenderNode_Delegate delegate = sManager.getDelegate(renderNode); - if (delegate != null && delegate.mPivotX != pivotX) { + if (delegate != null) { delegate.mPivotX = pivotX; - delegate.mPivotExplicitelySet = true; + delegate.mPivotExplicitlySet = true; return true; } return false; @@ -187,7 +255,7 @@ public class RenderNode_Delegate { /*package*/ static float nGetPivotX(long renderNode) { RenderNode_Delegate delegate = sManager.getDelegate(renderNode); if (delegate != null) { - if (delegate.mPivotExplicitelySet) { + if (delegate.mPivotExplicitlySet) { return delegate.mPivotX; } else { return (delegate.mRight - delegate.mLeft) / 2.0f; @@ -199,9 +267,9 @@ public class RenderNode_Delegate { @LayoutlibDelegate /*package*/ static boolean nSetPivotY(long renderNode, float pivotY) { RenderNode_Delegate delegate = sManager.getDelegate(renderNode); - if (delegate != null && delegate.mPivotY != pivotY) { + if (delegate != null) { delegate.mPivotY = pivotY; - delegate.mPivotExplicitelySet = true; + delegate.mPivotExplicitlySet = true; return true; } return false; @@ -211,7 +279,7 @@ public class RenderNode_Delegate { /*package*/ static float nGetPivotY(long renderNode) { RenderNode_Delegate delegate = sManager.getDelegate(renderNode); if (delegate != null) { - if (delegate.mPivotExplicitelySet) { + if (delegate.mPivotExplicitlySet) { return delegate.mPivotY; } else { return (delegate.mBottom - delegate.mTop) / 2.0f; @@ -219,4 +287,42 @@ public class RenderNode_Delegate { } return 0f; } + + @LayoutlibDelegate + /*package*/ static boolean nSetScaleX(long renderNode, float scaleX) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null && delegate.mScaleX != scaleX) { + delegate.mScaleX = scaleX; + return true; + } + return false; + } + + @LayoutlibDelegate + /*package*/ static float nGetScaleX(long renderNode) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null) { + return delegate.mScaleX; + } + return 0f; + } + + @LayoutlibDelegate + /*package*/ static boolean nSetScaleY(long renderNode, float scaleY) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null && delegate.mScaleY != scaleY) { + delegate.mScaleY = scaleY; + return true; + } + return false; + } + + @LayoutlibDelegate + /*package*/ static float nGetScaleY(long renderNode) { + RenderNode_Delegate delegate = sManager.getDelegate(renderNode); + if (delegate != null) { + return delegate.mScaleY; + } + 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 3952e1bd4817..cb84a1b0a416 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,12 @@ public final class CreateInfo implements ICreateInfo { "android.view.RenderNode#nDestroyRenderNode", "android.view.RenderNode#nSetElevation", "android.view.RenderNode#nGetElevation", + "android.view.RenderNode#nSetTranslationX", + "android.view.RenderNode#nGetTranslationX", + "android.view.RenderNode#nSetTranslationY", + "android.view.RenderNode#nGetTranslationY", + "android.view.RenderNode#nSetTranslationZ", + "android.view.RenderNode#nGetTranslationZ", "android.view.RenderNode#nSetRotation", "android.view.RenderNode#nGetRotation", "android.view.RenderNode#getMatrix", @@ -204,6 +210,10 @@ public final class CreateInfo implements ICreateInfo { "android.view.RenderNode#nGetPivotX", "android.view.RenderNode#nSetPivotY", "android.view.RenderNode#nGetPivotY", + "android.view.RenderNode#nSetScaleX", + "android.view.RenderNode#nGetScaleX", + "android.view.RenderNode#nSetScaleY", + "android.view.RenderNode#nGetScaleY", "android.view.RenderNode#nIsPivotExplicitlySet", "android.view.ViewGroup#drawChild", "android.widget.SimpleMonthView#getTitle", -- 2.11.0