根据之前的答案,可以像这样简化它以匹配 VectorDrawable 和 BitmapDrawable 并至少与 API 15 兼容。
public static Bitmap getBitmapFromDrawable(Context context, @DrawableRes int drawableId) {
Drawable drawable = AppCompatResources.getDrawable(context, drawableId);
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
} else if (drawable instanceof VectorDrawableCompat || drawable instanceof VectorDrawable) {
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;
} else {
throw new IllegalArgumentException("unsupported drawable type");
}
}
然后你必须在你的 gradle 文件中添加:
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
在 pre-Lollipop 上它将使用 VectorDrawableCompat,在 Lollipop 上它将使用 VectorDrawable。
编辑
我根据@user3109468 的评论编辑了条件
编辑 2 (10/2020)
至少从 API 21 开始,您现在可以使用它而不是上面的代码(我没有尝试过以前的 API 版本):
AppCompatResources.getDrawable(context, R.drawable.your_drawable)