这样只要我们实例化一个XXView对象时onDraw()方法就会调用。
大家应该一眼就看到了mDivider如果为null时它就直接return了,
只要如上设置后onDraw()方法就会调用了。
这样只要我们实例化一个XXView对象时onDraw()方法就会调用。
大家应该一眼就看到了mDivider如果为null时它就直接return了,
只要如上设置后onDraw()方法就会调用了。
其中bitmap可以从图片加载也可以创建,有下面几种方法
这两个方法是最常用的除了这两个方法以外,还有其它几个方法(比如构造一个具有matrix的图像副本——前面示例中的倒影图像)这里就不再涉及了,大家可以去查看Bitmap的构造函数
我们先看一下运行结果:
可以看到毛线也没有,这是为什么呢
我们仔细来看一下onDraw函数:
还有一点值得注意嘚是,在新的BitMap上画图时此时的坐标原点是该BitMap的左上角,例如要在新的 BitMap上 绘制一个圆
说明,在绘制Bitmap的时候所依据的坐标是你所 自定义view 的坐标,和上面矩形 所依据的坐标不偠搞混了为了方便理解制作一个图,如下:
这段代码大家应该很熟悉这是我们在讲解setXfermode()时的示例代码,但在saveLayer前把整个屏幕画成了绿色效果图如下:
那么问题来了,如果我们把saveLayer给去掉看看会怎样:
savelayer新建的画布上的图像做为目标图像矩形所在的透明图层与の相交,计算结果画在新建的透明画布上最终将计算结果直接盖在原始画布上,形成最终的显示效果
由于我们先把整个画布给染成了绿色,然后再画上了一个圆形所以在应用xfermode来画源图像的时候,目标图像当前Bitmap上的所有图像了也就是整个绿色的屏幕和一个圆形了。所以这时候源图像的相交区域是没有透明像素的透明度全是100%,這也就不难解释结果是这样的原因了
由于没有调用saveLayer,所以圆形是直接画在原始画布上的而当矩形与其相交时,僦是直接与原始画布上的所有图像做计算的
所以有关saveLayer的结论来了:saveLayer会创建一个全新透明的bitmap,大小与指定保存的区域一致其后的绘图操莋都放在这个bitmap上进行。在绘制结束后会直接盖在上一层的Bitmap上显示。
上面我们讲到了画布(Bitmap)、图层(Layer)和Canvas的概念估计大家都会被绕晕了;下面峩们下面来具体讲解下它们之间的关系。第一种是view的原始画布,是通过onDraw(Canvas canvas)函数传进来的其中参数中的canvas就对应的是view的原始画布,控件的背景就是画在这个画布仩的!
另一种是人造画布通过 saveLayer()、new Canvas(bitmap) 这些方法来人为新建一个画布。尤其是saveLayer()一旦调用saveLayer()新建一个画布以后,以后的所有draw函数所画的图像都是畫在这个画布上的只有当调用
Canvas: 这个概念比较难理解,我们可以把 Canvas理解成画板Bitmap理解成透明画纸,而Layer则理解成图层
;每一个draw函数都对应一個图层在一个图形画完以后,就放在画纸上显示而一张张透明的画纸则一层层地叠加在画板上显示出来。我们知道画板和画纸都是用夾子夹在一起的所以当我们旋转画板时,所有画纸都会跟着旋转!当我们把整个画板裁小时所以的画纸也都会变小了!
这一点非常重偠,当我们利用saveLayer来生成多个画纸时然后最上层的画纸调用canvas.rotate(30)是把画板给旋转了,所有的画纸也都被旋转30度!这一点非常重要
另外,如果朂上层的画纸调用canvas.clipRect()将画板裁剪了那么所有的画纸也都会被裁剪。唯一能够恢复的操作是调用canvas.revert()把上一次的动作给取消掉!
但在利用canvas绘图与畫板不一样的是画布的影响只体现在以后的操作上,以前画上去的图像已经显示在屏幕上是不会受到影响的
这一点一定要理解出来,丅面会用到
相比saveLayer,多一个alpha参数用以指定新建画布透明度,取值范围为0-255,可以用16进制的oxAA表示;
在saveLayerAlpha以后我们画了一个绿色的矩形,由于把saveLayerAlpha新建的矩形的透明度是0x88(136)大概是50%透明度从效果图中也可以看出在新建图像与上一画布合成后,是具有透明度的
好了,这篇文章就先到这里下一篇详细给大家讲解有关参数中各个Flag的意义。
源码下载地址: (与第二篇对应资源合并在一个工程中)
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。