android - 带有矢量可绘制对象的 TransitionDrawable

标签 android android-animation android-vectordrawable

我在 xml 中定义了 TransitionDrawable,如下所示:

transition.xml

<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_disabled" />
    <item android:drawable="@drawable/ic_enabled" />
</transition>

我用它来动画复选框的状态变化:

val stateDrawable = ContextCompat.getDrawable(this, R.drawable.transition) as TransitionDrawable
checkbox.buttonDrawable = stateDrawable
checkbox.setOnCheckedChangeListener { icon, checked -> 
    if (checked) {
        stateDrawable.startTransition(300) 
    } else {
        stateDrawable.reverseTransition(300)
    }
}

如果 @drawable/ic_disabled@drawable/ic_enabledpng 文件,一切正常。但如果它们是矢量可绘制对象,则过渡不起作用。我错过了什么? TransitionDrawable 不支持矢量绘图吗?

最佳答案

我知道这是旧的,但我遇到了同样的问题......在添加到 TransitionDrawable 之前,你必须将 Vector 转换为 BitmapDrawable。这是一个例子

            TransitionDrawable td = new TransitionDrawable(new Drawable[]{
                    getBitmapDrawableFromVectorDrawable(this, R.drawable.vector1),
                    getBitmapDrawableFromVectorDrawable(this, R.drawable.vector2)
            });
            td.setCrossFadeEnabled(true); // probably want this

            // set as checkbox button drawable...

实用方法//参见 https://stackoverflow.com/a/38244327/114549

public static BitmapDrawable getBitmapDrawableFromVectorDrawable(Context context, int drawableId) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        return (BitmapDrawable) ContextCompat.getDrawable(context, drawableId);
    }
    return new BitmapDrawable(context.getResources(), getBitmapFromVectorDrawable(context, drawableId));
}

public static Bitmap getBitmapFromVectorDrawable(Context context, int drawableId) {
    Drawable drawable = ContextCompat.getDrawable(context, drawableId);
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        drawable = (DrawableCompat.wrap(drawable)).mutate();
    }

    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
            drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);

    return bitmap;
}

关于android - 带有矢量可绘制对象的 TransitionDrawable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49777302/

相关文章:

android - 使用展开动画打开 Activity

android - 如何制作美丽时尚的应用程序,如 Timely

java - Android:将 VectorDrawable 添加到 ImageView

android - 来自可绘制资源 ID #0x7f0601d8 的异常 android.content.res.Resources$NotFoundException : File res/color/selector_tab_blue_white. xml

android - 单击时以编程方式更改矢量 Assets 颜色

android - 借助支持库 (23.4.0),无法在 Android API 19 中正确加载 Vector Drawable

android - 设置应用程序 Activity 以接受 action.VIEW action

android - 解析 XML 时出错 : duplicate attributes?

android - script.sh:第1行:./gradlew:Jenkins上没有这样的文件或目录

android - 抽屉导航动画android