如何在android <rotate>中计算pivotY和pivotX

时间:2016-11-30 17:16:56

标签: android rotation shape

有很多文章如何将三角形作为一个形状。但没有人解释如何计算pivotY和pivotX。 http://devdeeds.com/create-triangle-shape-using-xml-android/(例如为什么android:pivotX =&#34; -40%&#34; android:pivotY =&#34; 87%&# 34; ???我的逻辑预期0%和0%=左上角)

在以下代码中,当我更改 pivotX 时,矩形形状沿Y 轴移动,当我沿更改 pivotY时。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <rotate
            android:fromDegrees="45"
            android:pivotX="0%"
            android:pivotY="50%"
            >
            <shape
                android:shape="rectangle">
                <solid android:color="#000000" />

            </shape>
        </rotate>
    </item>
</layer-list>

我完全糊涂了。

我的最终目标是在下图中制作对角线三角形(渐变很容易制作http://angrytools.com/gradient/)。如果注意底部三角形溢出屏幕宽度,因此我无法将其作为位图插入,并确保它在所有屏幕分辨率下都能正常显示。

enter image description here

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。由于此属性中不允许使用 dp 之类的单位,因此您不知道需要什么单位。

来自 RotateDrawable 类:

if (a.hasValue(R.styleable.RotateDrawable_pivotX)) {
    final TypedValue tv = a.peekValue(R.styleable.RotateDrawable_pivotX);
    state.mPivotXRel = tv.type == TypedValue.TYPE_FRACTION;
    state.mPivotX = state.mPivotXRel ? tv.getFraction(1.0f, 1.0f) : tv.getFloat();
}
RotateDrawable

onDraw()

final float px = st.mPivotXRel ? (w * st.mPivotX) : st.mPivotX;
canvas.rotate(st.mCurrentDegrees, px + bounds.left, py + bounds.top);

RotateDrawable 的源代码显示:要么需要相对百分比值,如您所说,要么需要 float。 在类的 onDraw() 中,您可以看到该值直接用于 canvas.rotate() 的调用,而没有以某种方式进行处理,例如 TypedValue.complexToDimension()

因此您可以假设在 XML 属性中必须使用以像素为单位的值,这对矢量可绘制对象没有任何意义,因为它们可以任意缩放。 >

就我而言,它是一个 VectorDrawable,大小为 24dp x 24dp。轴心点应位于 (12dp|19dp)。所以我只是使用 12 of 24 = 50%19 of 24 = 79.16% 作为 RotateDrawable 的轴心点的值。要计算此值,您可以使用 https://percentagecalculator.net/ 例如。那么枢轴点是正确的,而无需多次尝试。