-
概念
-
图层(Layer)
每次调用cavas.drawXXX系列函数,都会生成一个透明图层专门来绘制这个图形。 -
画布(Bitmap)
每块画布都是一个Bitmap,所有的图像都是画在这个Bitmap上的。我们知道,每次调用canvas.drawXXX系列函数,都会生成一个专用的透明图层来绘制这个图形,绘制完以后,就覆盖在画布上。画布有两种:一种是View的原始画布,是通过onDraw(Cavas cavas)函数传入的;另一种是人造画布,通过saveLayer()、new Cavas(bitmap)等函数来人为地新建一块画布。尤其是saveLayer()函数,一旦调用它来新建一块画布,以后所有draw函数所画的图像都是画在这块画布上的,只有在调用restore()、restoreCount函数后,才会回到原始画布上进行绘制。 -
Cavas
Cavas是画布的表现形式,我们所要绘制的任何东西都是利用Cavas来实现的。在代码中,Cavas的生成方式只有一种——new Cavas(bitmap),即只能通过Bitmap生成,无论是原始画布还是人造画布,所有的画布都是通过Cavas画到Bitmap上的。可以把Cavas理解成绘图的工具,利用它所封装的绘图函数来绘图,而所要绘制的内容最后是画在Bitmap上的。所以,如果我们利用Cavas.clipXXX系列函数将画布进行裁剪,其实就是把对应的Bitmap进行裁剪,与之对应的结果是以后再利用Cavas绘图的区域会减小。
以上节选自启舰的《Android自定义控件开发入门与实践 》
-
关联
图层显示区域由画布显示区域决定,如图层大小超过画布显示区域,则裁减掉多余的部分;
画布显示区域由控件大小决定,如画布显示区域超过控件大小,Android会查看控件的clipChildren属性。如clipChildren为true,则裁减掉多余的部分,否则显示出整个画布内容。 -
其他
//坐标系XY轴各平移100,但是画布大小不变,还是铺满整个屏幕
canvas.translate(100,100);
canvas.drawColor(Color.RED);
Log.i("cavas", canvas.getWidth() + "---" + canvas.getHeight());
//画布上的图形以及图形之间的距离都缩小至指定倍数,但是画布大小不变,还是铺满整个屏幕
canvas.scale(0.5f,0.5f);
canvas.drawColor(Color.RED);
Log.i("cavas", canvas.getWidth() + "---" + canvas.getHeight());
//画布可绘制区域变成指定裁剪区域,但是画布的坐标系和大小不会发生改变,但是画布背景色不再铺满整个屏幕
canvas.clipRect(100,100,400,400);
canvas.drawColor(Color.RED);
Log.i("cavas", canvas.getWidth() + "---" + canvas.getHeight());
网友评论