带有矢量绘图的 TransitionDrawable

mol*_*mol 2 android android-animation android-vectordrawable

TransitionDrawable在xml中定义如下:

转换.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>
Run Code Online (Sandbox Code Playgroud)

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

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

aar*_*gas 5

我知道这已经很旧了,但我遇到了同样的问题...在添加到 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...
Run Code Online (Sandbox Code Playgroud)

实用方法 // 请参阅/sf/answers/2677102921/

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;
}
Run Code Online (Sandbox Code Playgroud)