对Canvas, Bitmap, Drawable的简单理解

  • Canvas,直译就是画布。官方定义如下:
package android.graphics;

/**
 * The Canvas class holds the "draw" calls. To draw something, you need
 * 4 basic components: A Bitmap to hold the pixels, a Canvas to host
 * the draw calls (writing into the bitmap), a drawing primitive (e.g. Rect,
 * Path, text, Bitmap), and a paint (to describe the colors and styles for the
 * drawing).
 */
public class Canvas extends BaseCanvas {
    private Bitmap mBitmap;

	public Canvas(@NonNull Bitmap bitmap) {
		……
        mBitmap = bitmap;
    }

	public void setBitmap(@Nullable Bitmap bitmap) {
		……
		mBitmap = bitmap;
    }
    
	……
}

翻译一下就是,要绘制内容,需要4个基本组件:一个用于容纳像素的Bitmap,一个用于承载绘制调用的Canvas,一个绘制图元和一个Paint。画布Canvas可以借助图元和颜料,将图形、颜色、位图等画在其持有的Bitmap上。

  • Bitmap,直译为位图,原型如下:
package android.graphics;

public final class Bitmap implements Parcelable {
	……
}

可见Bitmap作为final类,不能被继承。位图就是以若干个bit作为一个单元储存一个像素信息,若干个像素就组合成了一张图片。比如,若使用RGB_565配置,则每个像素存储在2个字节(16bits, 16=5+6+5)上,若使用ARGB_8888配置,则每个像素存储在4个字节(32bits)上。

  • Drawable,可绘制对象,原型如下:
package android.graphics.drawable;

public abstract class Drawable {
	……
}

Drawable作为抽象类,实例需要子类实现。Drawable的子类有很多,常见的有BitmapDrawableColorDrawableNinePatchDrawableShapeDrawable等。通常会将Drawable视为检索的资源类型,以将事物绘制到屏幕上。 Drawable类提供了用于处理可能采用多种形式的基础视觉资源的通用API。 与View不同,Drawable不具有接收事件或与用户进行交互的任何功能。

  • BitmapDrawable,可绘制位图,定义如下:
package android.graphics.drawable;

public class BitmapDrawable extends Drawable {
	……
}

BitmapDrawable就是一个包裹位图的Drawable,可以平铺,拉伸或对齐。
看到这里,对于怎样将Bitmap转换成Drawable就很明显了,由于BitmapDrawable就是一种Drawable,所以将Bitmap包裹成BitmapDrawable就行:

Drawable drawable = new BitmapDrawable(context.getResources(), bitmap);

而如果需要将Drawable转换成Bitmap,当这个Drawable是一个BitmapDrawable时,实际上就是获取BitmapDrawable里的Bitmap而已:

Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();

参考资料:

  1. 可绘制对象概览 | Android 开发者 | Android Developers
  2. Android: Bitmap/Canvas/Drawable - 掘金
  3. Android中 Bitmap和Drawable相互转换的方法 - 一点点征服 - 博客园

你可能感兴趣的:(学习笔记,Android)