Jadi setelah mencari (dan menggunakan) dari jawaban lain, tampaknya mereka semua menangani ColorDrawable
dan PaintDrawable
buruk. (Khususnya pada lollipop) sepertinya Shader
ada 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 setBounds
pada Drawable
sebelum meminta untuk mengubahnya menjadi bitmap, itu akan menarik bitmap di ukuran yang benar!