-
bitmap是用来存放像素的
-
Canvas 本意是画布的意思,但是在Android中,它就只是一个媒介,可以通过Canvas来调用drawRect,drawCircle等等,但是实际上画的这些东西最终展现的时候都是像素,但是只有Bitmap才能保存像素,而Canvas并不行,所以在创建Canvas的时候,就必须传递一个Bitmap,用来承载画的内容。
可以理解为 再Bitmap上铺一层画布 然后开始用paint 作画 最后还是以bitmap显示出来 -
A Drawable is a general abstraction for “something that can be drawn.”
Drawable就是能够被画到画布上的对象。
所以,Bitmap是一种Drawable,于是有了BitmapDrawable,颜色是一种Drawable,所以有了ColorDrawable. 形状是一种Drawable,所以有了ShapeDrawable。
关于这三者的关系 再drawble 转为bitmap时最能够体现,例如
private Bitmap drableToBitMap(Drawable drawable) {
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
Bitmap outPut = Bitmap.createBitmap(width, height, drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(outPut);
drawable.setBounds(0, 0, width, height);
drawable.draw(canvas);
return outPut;
}
这段代码中可以看到首先创建了一个Bitmap,然后传入canvas中 setBounds是指drawble将被绘制在哪一块(相对于canvas的坐标),然后将drawble画上去
思考
传参时为什么要用Bitmap.create函数而不能用BitmapFactory.decodeResource(getResources(),R.drawable.demon,options);
看源码后会发现 canvas构造方法以及setBitmap方法
if (!bitmap.isMutable()) {
throw new IllegalStateException(
"Immutable bitmap passed to Canvas constructor"); }
发现bitmap一定要是 mutable,而用BitmapFactory构造出来的bitmap默认isMutable是fasle的,问题解决
网友评论