Então, depois de procurar (e usar) as outras respostas, parece que todas estão lidando mal ColorDrawablee PaintDrawablemal. (Especialmente no pirulito) parecia que Shaders eram ajustados para que blocos de cores sólidos não fossem manuseados corretamente.
Estou usando o seguinte código agora:
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;
}
Diferente dos outros, se você solicitar setBoundso Drawableantes de transformá-lo em um bitmap, ele desenhará o bitmap no tamanho correto!