【发布时间】:2019-02-15 14:47:17
【问题描述】:
我有一个带有 CardViews 的 RecyclerView。卡片有 TextViews 和 ImageButtons,按钮使用矢量 drawables。我希望卡片根据启用状态淡入/淡出。
我已经设法让卡片高度和 textColor 使用设置为卡片样式的选择器设置动画,但相同的代码似乎不适用于向量的 strokeColor 和 fillColor 属性。他们不尊重主题设置的属性,还是我错过了其他东西?
该应用完全用 Kotlin 编写并使用 AndroidX/JetPack。
我玩过动画矢量和动画选择器,但我无法让它们工作。对于我希望在其间淡入淡出的每种颜色组合,我是否需要单独的矢量可绘制对象?
向量属于简单类型(播放按钮示例):
<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>
【问题讨论】:
标签: android colors selector animator