先来看今天遇到的一个问题,是关于mms报错的。后来发现报的地方如下
Bitmap deleteBitMap = ((BitmapDrawable)mChipDelete).getBitmap();
Drawable mChipDelete = r.getDrawable(R.drawable.chip_delete);
我发先,chip_delete,我用的是.9图片。报错信息
java.lang.ClassCastException: android.graphics.drawable.NinePatchDrawable cannot be cast to android.graphics.drawable.BitmapDrawable
也就是说,点9图片不能转化为BitmapDrawable类型
好了,废话不多说了,我们来总结下bitmap跟drawable的转化
以下内容参考http://blog.csdn.net/sanjinxiong/article/details/9861547
1.bitmap->drawable
public static Drawable BitmapToDrawable(Bitmap bitmap) { if (bitmap != null) { return new BitmapDrawable(bitmap); } return null; }
上面的方法BitmapDrawable(bitmap)提示过时,这时候,我们用如下的方法就可以了
new BitmapDrawable(getResources(),bitmap)
2.drawable -> bitmap
public static Bitmap drawableToBitmap(Drawable drawable) { if (drawable instanceof BitmapDrawable) { return ((BitmapDrawable) drawable).getBitmap(); } else if (drawable instanceof NinePatchDrawable) { // 取 drawable 的长宽 int w = drawable.getIntrinsicWidth(); int h = drawable.getIntrinsicHeight(); // 取 drawable 的颜色格式 Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; // 建立对应 bitmap Bitmap bitmap = Bitmap.createBitmap(w, h, config); // 建立对应 bitmap 的画布 Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, w, h); // 把 drawable 内容画到画布中 drawable.draw(canvas); return bitmap; } else { return null; } }
这个要注意,因为drawable有普通跟.9的区别,这两种图片格式转化的方法是不一样的。普通的.9图片可以直接转化,也就是
((BitmapDrawable) drawable).getBitmap()
而.9的就要复杂些,需要把drawable绘制到一个bitmap上。