最近刚刚写了一个贪吃蛇的游戏,需要不断绘图,也就对Canvas和Drawable有了一点点认识。
首先是Canvas。Canvas的直译就是画布,负责在View上进行各种绘画,但实际上Canvas是在一个Bitmap对象上进行绘画的,该Bitmap会告诉Canvas如何进行绘画(比如每个像素点如何存储这些),而之后在Canvas上所进行的各种绘画都会保存在该Bitmap上。例如下面的一段代码:
Bitmap bitmap = Bitmap.createBitmap(20, 20, Bitmap.Config.ARGB_8888);
Canvas canvas=new Canvas(bitmap);
Paint paint=new Paint();
paint.setColor(Color.GREEN);
canvas.drawCircle(10, 10, 10, paint);
首先bitmap设置了在该Bitmap上每个像素点用4个字节来存储(RGB以及透明度,每一项用8位来表示0-255共256中级别);然后建立一个以该Bitmap为基础的canvas,然后再这个Canvas上画一个绿色圆。现在变量bitmap就是一个包含有绿色圆的20*20的位图了,如果不行,各位大可以在一个view的OnDraw()函数上直接画这个bitmap。
大多数时候,我们的绘图操作都是在View的OnDraw(Canvas canvas)函数中进行操作的,而系统已经给我们配置了一个canvas,不需要我们去设定该Canvas的Bitmap,当然如果你不喜欢默认的设置也可以自己设定。而如果不是在OnDraw函数中进行设定的话就要自己设定Bitmap了。
另外还想说的一点就是,是Canvas在响应各种与画图有关的函数。
对于Drawable没有太多的可说的,简单地说其实就是一个管理各种drawable资源文件夹下各种资源的对象而已。在这里仅介绍其两个类函数,一个是setBounds()函数该函数设定具体的drawable资源应该画在何种范围之下,必须调用该函数来进行设定(至少SDK上是这样说的),另外一个就是draw(Canvas canvas)函数,这是指将该drawable资源画在具体的canvas之上,并且按照setBounds函数设定的范围以及Canvas的bitmap的配置。
例:
public void loadTile( Drawable tile) {
Bitmap bitmap = Bitmap.createBitmap(mTileSize, mTileSize, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
tile.setBounds(0, 0, mTileSize, mTileSize);
tile.draw(canvas);
}
此时在一个canvas上画上了一个Drawable对象,也就是bitmap现在所显示的就是这个Drawable对象了。