Как я могу затушевывать / анимировать strokeColor и fillColor вектора в XML? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть RecyclerView с CardViews.Карты имеют TextViews и ImageButtons, кнопки используют векторные рисунки.Я хочу, чтобы карты появлялись и исчезали в зависимости от включенного состояния.

Мне удалось получить повышение высоты карты и textColor для анимации с помощью селектора, установленного в стиле, используемом для карт, но с тем же кодом.похоже, не работает для атрибутов strokeColor и fillColor векторов.Они не уважают атрибуты, установленные темами, или я что-то упускаю?

Приложение написано полностью на Kotlin и использует AndroidX / JetPack.

Я играл с анимированнымиvector и animates-селектор, но я не могу заставить их работать.Нужны ли отдельные векторные рисунки для каждой цветовой комбинации, между которыми я хочу постепенно исчезнуть?

Векторы простого типа (пример кнопки воспроизведения):

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
    <path
        android:strokeWidth="?android:strokeWidth"
        android:pathData="M8,5v14l11,-7z"/>
</vector>

Они инкапсулированы в ImageButtons вмакет представления карты:

<ImageButton
    android:layout_width="40dp"
    android:layout_height="40dp" app:srcCompat="@drawable/ic_session_play"
    android:id="@+id/playButton" app:layout_constraintEnd_toStartOf="@+id/stopButton"
    app:layout_constraintBottom_toBottomOf="parent"
    android:scaleType="fitCenter" android:background="?attr/selectableItemBackgroundBorderless"/>

Цвета и высота затем устанавливаются в селекторе аниматора:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto" >
    <item android:state_enabled="true" >
        <objectAnimator android:duration="@integer/enabled_transition_time" >
            <propertyValuesHolder
                    android:propertyName="elevation" android:valueType="floatType"
                    android:valueFrom="@dimen/session_card_disabled_elevation" android:valueTo="@dimen/session_card_enabled_elevation" />
            <propertyValuesHolder
                    android:propertyName="textColor" android:valueType="colorType"
                    android:valueFrom="@color/session_card_disabled_dark" android:valueTo="@color/session_card_enabled_dark" />
            <propertyValuesHolder
                    android:propertyName="fillColor" android:valueType="colorType"
                    android:valueFrom="@color/session_card_disabled_light" android:valueTo="@color/session_card_enabled_light" />
            <propertyValuesHolder
                    android:propertyName="strokeColor" android:valueType="colorType"
                    android:valueFrom="@color/session_card_disabled_dark" android:valueTo="@color/session_card_enabled_dark" />
        </objectAnimator>
    </item>
    <item android:state_enabled="false" >
        <objectAnimator android:duration="@integer/enabled_transition_time" >
            <propertyValuesHolder
                    android:propertyName="elevation" android:valueType="floatType"
                    android:valueFrom="@dimen/session_card_enabled_elevation" android:valueTo="@dimen/session_card_disabled_elevation" />
            <propertyValuesHolder
                    android:propertyName="textColor" android:valueType="colorType"
                    android:valueFrom="@color/session_card_enabled_dark" android:valueTo="@color/session_card_disabled_dark" />
            <propertyValuesHolder
                    android:propertyName="fillColor" android:valueType="colorType"
                    android:valueFrom="@color/session_card_enabled_light" android:valueTo="@color/session_card_disabled_light" />
            <propertyValuesHolder
                    android:propertyName="strokeColor" android:valueType="colorType"
                    android:valueFrom="@color/session_card_enabled_dark" android:valueTo="@color/session_card_disabled_dark" />
        </objectAnimator>
    </item>
</selector>

и, наконец, на это ссылаются в объявлении стиля:

<style name="SessionCardStyle" parent="AppTheme">
    <item name="android:stateListAnimator">@animator/session_card_enable_disable</item>
    <item name="android:strokeWidth">1</item>
</style>

1 Ответ

0 голосов
/ 18 февраля 2019

Хорошо, так что я разобрался ... CardView сам анимирует определенные значения.Все, что мне нужно было сделать, это переместить значения цвета в мой файл styles.xml:

    <style name="SessionCardStyle" parent="AppTheme">
        <item name="android:stateListAnimator">@animator/session_card_enable_disable</item>
        <item name="android:textColor">@color/session_card_darks</item>
        <item name="android:fillColor">@color/session_card_lights</item>
        <item name="android:strokeColor">@color/session_card_darks</item>
        <item name="android:strokeWidth">1</item>
    </style>

. И у них есть селекторы для цветов на основе включенного состояния (это res / color / session_card_darks.xml):

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_enabled="true"  android:color="#FF000000" />
    <item android:state_enabled="false" android:color="#40000000" />
</selector>

И, наконец, уберите все эти цвета у аниматора:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_enabled="true" >
        <objectAnimator android:propertyName="elevation" android:valueType="floatType" android:valueTo="@dimen/session_card_enabled_elevation" />
    </item>
    <item android:state_enabled="false" >
        <objectAnimator android:propertyName="elevation" android:valueType="floatType" android:valueTo="@dimen/session_card_disabled_elevation" />
    </item>
</selector>

Тем не менее, если кто-нибудь знает, как иметь селекторы для размеров непосредственно, это может быть еще меньше.

...