Jadi setelah mencari (dan menggunakan) dari jawaban lain, tampaknya mereka semua menangani ColorDrawabledan PaintDrawableburuk. (Khususnya pada lollipop) sepertinya Shaderada perubahan sehingga blok warna solid tidak ditangani dengan benar.
Saya menggunakan kode berikut sekarang:
public static Bitmap drawableToBitmap(Drawable drawable) {
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
}
// We ask for the bounds if they have been set as they would be most
// correct, then we check we are > 0
final int width = !drawable.getBounds().isEmpty() ?
drawable.getBounds().width() : drawable.getIntrinsicWidth();
final int height = !drawable.getBounds().isEmpty() ?
drawable.getBounds().height() : drawable.getIntrinsicHeight();
// Now we check we are > 0
final Bitmap bitmap = Bitmap.createBitmap(width <= 0 ? 1 : width, height <= 0 ? 1 : height,
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
Tidak seperti yang lain, jika Anda memanggil setBoundspada Drawablesebelum meminta untuk mengubahnya menjadi bitmap, itu akan menarik bitmap di ukuran yang benar!