为什么 xml 可绘制对象在 Android Studio 中看起来与 phone 不同?

Why does the xml drawable look different in Android Studio than the phone?

我正在尝试制作一个看起来像蛇的圆形进度条。 在我的 phone 中,它看起来和我想要的一模一样:

然而,Android Studio 展示了一些非常不同的东西:

也就是说,蛇的“头”被拉长了,偏离了中心...恐怕Android 会在不同的phone 中显示不同的drawables。如何解决?

这是我放置在 res > drawables 中的 drawable 的 progress_gradient.xml(我在我的 phone 中经过几次尝试和错误后才得出这个):

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="720">

    <layer-list>
        <item>
            <shape
                android:innerRadiusRatio="3"
                android:shape="ring"
                android:thicknessRatio="30"
                android:useLevel="false">

                <size
                    android:width="100sp"
                    android:height="100sp" />

                <gradient
                    android:angle="0"
                    android:endColor="#9ac14e"
                    android:startColor="@android:color/transparent"
                    android:type="sweep"
                    android:useLevel="false" />

            </shape>
        </item>
        <item
            android:left="82sp"
            android:right="16dp"
            android:top="47sp"
            android:bottom="45sp"
            >

            <shape
                android:shape="oval" >
                <solid android:color="#9ac14e"/>

            <size
                    android:width="1sp"
                    android:height="5sp" />

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

</rotate>

这就是我在布局中加载它的方式:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"

android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:orientation="vertical">

...

<ProgressBar
    android:id="@+id/waitcircle"
    android:layout_width="100sp"
    android:layout_height="100sp"
    android:layout_marginTop="50dp"
    android:layout_gravity="center_horizontal"
    android:indeterminate="true"
    android:indeterminateDrawable="@drawable/progress_gradient"/>

</LinearLayout>

看起来“头”被尾巴透支了。丢失的块与绘制尾巴的区域相匹配。如果先画了头,然后在不透明的情况下画了尾巴,这就是我希望看到的。

Android Studio 和设备有不同的绘图系统。当他们不同意时,假设您会看到设备的版本。然而,对于这样的事情,我会在各种 OS 版本上进行测试以仔细检查,这是一种对可绘制子系统的实现进行调整可能会破坏你的事情。

顺便说一句 - 我不确定我是否会为此使用 xml 可绘制对象。如果你真的想控制它的外观,我会选择矢量可绘制对象或 png 图像。

您的代码中还有一个可能的问题 - 您的“头部”混合了 sp 和 dp 大小。这些是不同的东西。如果视力不好的人将文字放大一点,它会让你崩溃。使用一个或另一个。为此,它应该完全是 dp - 没有理由根据文本大小来缩放它。