AnimatedVectorDrawableCompat

AnimatedVectorDrawableCompat

这是我的build.gradle

    defaultConfig {
    ...
    minSdkVersion 21
    targetSdkVersion 26
    vectorDrawables.useSupportLibrary = true
}

和布局的一部分
<ImageView
    android:id="@+id/recents"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="?attr/selectableItemBackground"
    android:clickable="true"
    android:scaleType="fitCenter"
    app:srcCompat="@drawable/anim_test"/>

和类(class) Actor :
val np = convertView.findViewById<ImageView>(R.id.recents)
val anim = np.drawable as AnimatedVectorDrawableCompat

这在Lolipop(sdk 21)上可以正常工作,但在Nougat上却失败了:
android.graphics.drawable.AnimatedVectorDrawable cannot be cast to android.support.graphics.drawable.AnimatedVectorDrawableCompat

我没有得到的是,为什么系统已经支持AnimatedVectorDrawable时,为什么它在sdk级别21上完全返回AnimatedVectorDrawableCompat。为何尽管指定了vectorDrawables.useSupportLibrary = true却仍在牛轧糖中返回AnimatedVectorDrawable。

最佳答案

简短答案:
使用AnimatedVectorDrawableCompat.registerAnimationCallback静态方法,它将为您完成这项工作。

(drawable as Animatable).start()

AnimatedVectorDrawableCompat.registerAnimationCallback(
        drawable,
        object : Animatable2Compat.AnimationCallback() {
            override fun onAnimationEnd(drawable: Drawable?) {
                postOnAnimation {
                    (drawable as Animatable).start()
                }
            }
        })

长答案:
当我尝试循环动画矢量可绘制对象时,我遇到了同样的问题。直到我发现支持库在不同的SDK级别上返回了不同的类(AnimatedVectorDrawableAnimatedVectorDrawableCompat)。
除了Nick Butcher的精彩博客文章外,其他任何地方都没有记录:
https://medium.com/androiddevelopers/re-animation-7869722af206
他说:

在博客文章中,作者还建议了其他方法来解决此问题,例如使用AnimatedVectorDrawableCompat#create方法和在运行时设置可绘制对象。
我建议您阅读全文。
希望这可以帮助。

10-07 19:25