13

Just testing the new developer preview and noticed that my existing ring drawables are not rendering properly. Instead of a ring it's a full circle. Is it a bug or has something changed or am I doing it wrong to begin with? Any possible solutions?

here's the code:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@android:id/progress">
        <shape
            android:innerRadiusRatio="3"
            android:shape="ring"
            android:thicknessRatio="7.0">
            <solid android:color="#ff5698fb"/>
        </shape>
    </item>
</layer-list>

Thanks!

Update

I've updated the shape as follows:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape
            android:innerRadiusRatio="3"
            android:shape="ring"
            android:thicknessRatio="7.0">
            <solid android:color="#ff5698fb"/>
        </shape>
    </item>
    <item >
        <shape
            android:innerRadiusRatio="4"
            android:shape="ring"
            android:thicknessRatio="5.5">
            <solid android:color="#ffffff"/>
        </shape>
    </item>
</layer-list>

which produces a ring by overlaying two circles. But the progress bar that I'm using it in doesn't work. Here is the code for the progress bar:

<ProgressBar
                android:id="@+id/progressCircle"
                style="?android:attr/progressBarStyleHorizontal"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:indeterminate="false"
                android:max="100"
                android:progress="65"
                android:rotation="270"
                android:progressDrawable="@drawable/progress_circle"
                android:visibility="visible"/>
4

3 回答 3

21

TL;DR:显式设置useLevel自定义进度条中使用的所有环形的值。


卡诺的答案是解决您的问题的方法。我正在对其进行补充以在自定义进度条中添加有关环形形状的一般信息。

似乎默认值useLevel在 Android 版本上发生了变化。这是一篇与它相关的调查。

以下是进度条的工作实现,使用一个环作为进度指示器,另一个环作为进度背景:

<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Progress background -->
    <item android:id="@android:id/background">
        <shape
            android:shape="ring"
            android:useLevel="false">
            <solid
                android:color="#dae1e6"/>
        </shape>
    </item>

    <!-- Progress -->
    <item android:id="@android:id/progress">
        <!-- Rotation of the progress to start at the top-->
        <rotate
            android:fromDegrees="-90"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="-90">
            <shape
                android:shape="ring"
                android:useLevel="true">
                <solid
                    android:color="#61bcf9"/>
            </shape>
        </rotate>
    </item>

</layer-list>

progressDrawable在 a 中使用它ProgressBar

<ProgressBar
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:progressDrawable="@drawable/custom_horizontal"
    android:progress="50"
    android:max="100"
    android:id="@+id/progressBar"
    android:layout_gravity="center"/>

设置useLevel=true为进度环形状和useLevel=false背景环形状,可为所有 Android 版本提供正确的所需行为:

在两个版本中都正确

useLevel从背景形状中移除:

5.0 之前(左)| 5.0(右)

在 KitKat 中不正确 在棒棒糖中正确

useLevel从进度形状中移除:

5.0 之前(左)| 5.0(右)

在 KitKat 中正确 棒棒糖不正确


因此,据我了解,useLevel用于指示形状是否受进度值的影响。如果不是 (false),它将被完全绘制;如果它是(真),它会像进度值一样被绘制。

综上所述,似乎:

  • useLeveltrueAndroid < 5.0中默认为,如果useLevel未在其环形中设置,则会导致背景环跟随进度值,从而使其隐藏在进度指示器环的后面。
  • useLevelfalseAndroid >= 5.0中默认为,如果useLevel未在其环形形状中设置,则会导致进度指示器环被完全绘制。

因此,由于这种不一致,最好在取决于进度的形状中显式设置 to 的值,useLeveltrue在不依赖于进度的形状中明确设置 to 的值false

这种行为是基于我的观察,我还没有找到任何证实它的来源。官方的Android文档对此不是很清楚......

于 2014-10-23T16:44:53.493 回答
21

您需要添加android:useLevel="true"进度项。这在以前的版本中似乎没有必要,但 L 想要它。

<item android:id="@android:id/progress">
    <shape
        android:innerRadiusRatio="3"
        android:shape="ring"
        android:thicknessRatio="7.0"
        android:useLevel="true" >
        <solid android:color="#ff5698fb"/>
    </shape>
</item>
于 2014-07-30T20:49:24.290 回答
1

只是想在框架源代码中添加一些引用,以确认 useLevel 在 Android API 版本 < 21 (< 5.0) 中默认为 true,在 API 版本 >= 21 (>= 5.0) 中默认为 false,正如 Christian García 之前所说。

在 android-20 中,文件 GradientDrawable.java,第 820-835 行:

if (shapeType == RING) {
    ....
    st.mUseLevelForShape = a.getBoolean(
                    com.android.internal.R.styleable.GradientDrawable_useLevel, true);
}

在 android-21 中,文件 GradientDrawable.java,第 1028-1047 行:

if (state.mShape == RING) {
    ....
    state.mUseLevelForShape = a.getBoolean(
                    R.styleable.GradientDrawable_useLevel, state.mUseLevelForShape);
}
于 2015-10-18T16:17:02.333 回答