Подтвердить что ты не робот

Кольцевые формы для предварительного просмотра L не работают

Просто протестировав новый предварительный просмотр разработчика и заметив, что мои существующие образы ссылок не отображаются должным образом. Вместо кольца это полный круг. Это ошибка или что-то изменилось, или я делаю это неправильно, чтобы начать? Любые возможные решения?

здесь код:

<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>

Спасибо!

Обновление

Я обновил форму следующим образом:

<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>

который создает кольцо, накладывая два круга. Но индикатор выполнения, в котором я его использую, не работает. Вот код для индикатора выполнения:

<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"/>
4b9b3361

Ответ 1

Вам нужно добавить 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>

Ответ 2

TL; DR: явно задайте значение useLevel для всех форм колец, используемых в пользовательских шагах выполнения.


Ответ на вопрос Kano - это способ решить вашу проблему. Я дополняю его, чтобы добавить общую информацию о кольцевых формах в пользовательские строки выполнения.

Кажется, что значение по умолчанию для 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 в 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:

Correct in both versions

Удаление useLevel из формы фона:

Pre 5.0 (слева) | 5.0 (справа)

Incorrect in KitKatCorrect in Lollipop

Удаление useLevel из формы выполнения:

Pre 5.0 (слева) | 5.0 (справа)

Correct in KitKatIncorrect in Lollipop


Итак, как я понимаю, useLevel используется, чтобы указать, влияет ли на форму значение прогресса. Если это не (ложь), оно будет полностью окрашено; если оно (true), оно будет окрашено так же, как и значение прогресса.

Подводя итог, кажется, что:

  • useLevel по умолчанию используется true в Android < 5.0, заставляя фоновое кольцо отслеживать значение прогресса, если useLevel не задано в его кольцевой форме, что делает его скрытым за кольцом индикатора хода.
  • useLevel по умолчанию используется false в Android >= 5.0, заставляя кольцо индикатора прогресса полностью окрашиваться, если useLevel не задано в его кольцевой форме.

Итак, из-за этой несогласованности лучше явно установить значение useLevel в true в фигурах, которые зависят от прогресса, и до false в тех, которые этого не делают.

Это поведение основано на моих наблюдениях, я не нашел ни одного источника, подтверждающего его. Официальные документы Android не очень понятны...

Ответ 3

Просто хочу добавить некоторые ссылки в исходный код рамки, чтобы подтвердить, что useLevel по умолчанию имеет значение true в версии Android API < 21 (< 5.0) и по умолчанию было установлено значение false в версии API >= 21 ( >= 5,0), как ранее заявлял Христиан Гарсия.

В 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);
}