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
This commit is contained in:
Jerome Gaillard
2016-01-19 13:11:08 +00:00
parent b9c48d8f49
commit c92d70dff7
2 changed files with 163 additions and 0 deletions

View File

@@ -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;
}
}

View File

@@ -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",