Bitmap「白纸」

我们在屏幕上看到的图像,都是由一个一个的像素组成的,那么这些像素是从哪来的?由上面这句话,我们就知道答案了,这些像素就是存放在 Bitmap 中的,由此,我们可以认为 Bitmap 就是用来直接展示在窗口上的一个显示对象,它是一个最终的产品

Canvas「画板」

1
2
Bitmap bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);        
Canvas canvas = new Canvas(bitmap);

上面是创建 Canvas 的一段代码,由这,我们知道,要创建 Canvas,必须先创建一个 Bitmap 对象,并将其作为参数传给 Canvas。
那么,我们可以只创建 Canvas,然后不给其传递 Bitmap 对象吗?
不可以!
为什么?
Canvas 本意是画布的意思,但是在 Android 中,它就只是一个媒介,可以通过 Canvas 来调用 drawRect,drawCircle 等等,但是实际上画的这些东西最终展现的时候,
都是像素,但是只有 Bitmap 才能保存像素,而 Canvas 并不行,所以在创建 Canvas 的时候,就必须传递一个 Bitmap,用来承载画的内容。
可以这么理解,现在在我们面前有一张空白的纸 (Bitmap),但是我们不能将画笔直接点到上面,我们必须先在这张纸上面放一块画布(Canvas),然后我们在这张画布上

开始点点点… 最后,我们就可以看到,我们所有的形为都通过画布作用到纸上了,这时候,那张空白的纸已经是一张画了,而我们掀掉画布,就能够直接将这张画给别人看了。

而此时,Canvas 已经没有作用了,它的作用只在于承接我们的画笔操作,然后将所对应位置的像素存储到对应的 Bitmap 中。

1
2
canvas.drawPath(mPath, mHighlightPaint);
return bitmap;

不知道,这么说,大家能够理解 Canvas 和 Bitmap 的关系不?
简单地说,我们要进行画画的操作,我们需要通过 Canvas 来实现,但是每一个 Canvas 都必须有相对应的 Bitmap 来承载内容,我们在 Canvas 上所作的操作最终都是会写到 Bitmap 中的。
而最终展现给用户看的内容,也是通过 Bitmap 来展现的。

Paint

Drawable

A Drawable is a general abstraction for “something that can be drawn.”
Drawable 就是能够被画到画布上的对象。

所以,Bitmap 是一种 Drawable,于是有了 BitmapDrawable,颜色是一种 Drawable,所以有了 ColorDrawable. 形状是一种 Drawable,所以有了 ShapeDrawable。
个人觉得,它就是一个类似接口之类的东西,而本质上它也是一个抽象类,继承了 Drawable,就表明这东东是可绘制的。

另一篇:今天在项目中通过

1
BitmapFactory.decodeResource(getResources(),R.drawable.demon,options);

给 Canvas 作为构造参数,结果报了一个错

这里写图片描述

因为:在 canvas 类中你可以看到无论是构造方法还是 setBitmap (Bitmap bitmap) 中都有

1
2
3
if (!bitmap.isMutable()) {
throw new IllegalStateException(
"Immutable bitmap passed to Canvas constructor"); }

就是说 如果 bitmap 不可改变的情况下,canvas 是不允许进行绘制的
当你用 BitmapFactory.decodeResource, 返回的 bitmap 是默认状态下的 mIsMutable=false;(其他方法应该也是一样的,你自己可以看看)
Bitmap.createBitmap() 中可以看到返回的是
Bitmap bm = nativeCreate(null, 0, width, width, height, config.nativeInt, true); 这最后一个参数是 true 的也就是 mutable,说可以改变的位图

1
2
3
private static native Bitmap nativeCreate(int[] colors, int offset,
int stride, int width, int height,
int nativeConfig, boolean mutable);

所以传给 Canvas 的 Bitmap 需要通过 Bitmap.createBitmap () 创建

Drawable to Bitmap

1
2
Bitmap mIcon = BitmapFactory.decodeResource(context.getResources(),R.drawable.icon);
// mImageView.setImageBitmap(mIcon);

Bitmap to Drawable

1
2
Drawable mDrawable = new BitmapDrawable(getResources(), bitmap);
// mImageView.setDrawable(mDrawable);