首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >棉花糖上的不同AnimatedVectorDrawable (shapeshifter动画,涉及androidx )

棉花糖上的不同AnimatedVectorDrawable (shapeshifter动画,涉及androidx )
EN

Stack Overflow用户
提问于 2020-01-15 21:56:11
回答 1查看 237关注 0票数 0

我的动画代码崩溃了。它是从xml创建的动画:

代码语言:javascript
复制
<animated-vector
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt">
    //not relevant
</animated-vector>

运行动画并崩溃的代码:

代码语言:javascript
复制
val animationDrawable = ContextCompat.getDrawable(context, R.drawable.anim_logbook_register_measurement)

    val callback = object : Animatable2Compat.AnimationCallback() {
        override fun onAnimationStart(drawable: Drawable?) {
            super.onAnimationStart(drawable)
            //not relevant
        }

        override fun onAnimationEnd(drawable: Drawable) {
            //not relevant
        }
    }

    AnimatedVectorDrawableCompat.registerAnimationCallback(animationDrawable, callback)
    animationCallback = callback
    (animationDrawable as? Animatable)?.start()

AnimatedVectorDrawableCompat.registerAnimationCallback(animationDrawable, callback)行发生崩溃,原因如下:

代码语言:javascript
复制
android.graphics.drawable.AnimatedVectorDrawable cannot be cast to androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat

看起来ContextCompat.getDrawable在android6上创建了非androidx的AnimatedVectorDrawable,而AnimatedVectorDrawableCompat .registerAnimationCallback期望androidx one并崩溃。当查看AnimatedVectorDrawableCompat内部时,这一点变得很明显

代码语言:javascript
复制
public static void registerAnimationCallback(Drawable dr,
        Animatable2Compat.AnimationCallback callback) {
    if (dr == null || callback == null) {
        return;
    }
    if (!(dr instanceof Animatable)) {
        return;
    }

    if (Build.VERSION.SDK_INT >= 24) {
        registerPlatformCallback((AnimatedVectorDrawable) dr, callback);
    } else {
        ((AnimatedVectorDrawableCompat) dr).registerAnimationCallback(callback);
    }
} 

在我看来,line的Android bug,有人注意到这一点吗?有没有一种方法可以在从5开始的所有版本上工作?

EN

回答 1

Stack Overflow用户

发布于 2020-01-16 00:06:27

这很糟糕,但如果我像这样从xml加载drawable,它显然是有效的:

代码语言:javascript
复制
val animationDrawable = return if (Build.VERSION.SDK_INT >= 24) {
        ContextCompat.getDrawable(this, R.drawable.anim_logbook_register_measurement)
    } else {
        AnimatedVectorDrawableCompat.create(this, R.drawable.anim_logbook_register_measurement)
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59752902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档