canvas操作

来源:互联网 发布:js的横向时间轴源码 编辑:程序博客网 时间:2024/06/17 03:09

    • 第一类基本变换
      • 效果连续性
      • 总结
    • 第二类画布的保存与恢复
      • Save
      • saveLayer
      • saveLayerAlpha
      • restore
      • restoreToCount
    • 另clip
      • saveFLAG

摘自以下文章
自定义控件之绘图篇(四):canvas变换与操作
自定义控件三部曲之绘图篇(十三)——Canvas与图层(一)
自定义控件三部曲之绘图篇(十四)——Canvas与图层(二)

第一类:基本变换

效果连续性

translate、scale、rotate、skew这些操作都是连续作用,会基于之前的操作继续进行

总结

1、每次调用canvas.drawXXXX系列函数来绘图进,都会产生一个全新的Canvas画布
2、如果在DrawXXX前,调用平移、旋转等函数来对Canvas进行了操作,那么这个操作是不可逆的!每次产生的画布的最新位置都是这些操作后的位置。(关于Save()、Restore()的画布可逆问题的后面再讲)
3、在Canvas与屏幕合成时,超出屏幕范围的图像是不会显示出来的。

第二类:画布的保存与恢复

区别
Save():保存画布状态,放入栈中
saveLayer():保存画布状态,,放入栈中,并且新建一个bitmap图层,之后的操作在新的bitmap上执行
saveLayerAlpha():与saveLayer()相同,只不过多一个透明度

Save()

每次调用Save()函数,都会把当前的画布的状态进行保存,然后放入特定的栈中

saveLayer()

saveLayer会创建一个全新透明的bitmap,大小与指定保存的区域一致,其后的绘图操作都放在这个bitmap上进行。在绘制结束后,会直接盖在上一层的Bitmap上显示。
saveLayer后的所有动作都只对新建画布有效

saveLayerAlpha()

相比saveLayer,多一个alpha参数,用以指定新建画布透明度,取值范围为0-255,可以用16进制的oxAA表示;
这个函数的意义也是在调用的时候会新建一个bitmap画布,以后的各种绘图操作都作用在这个画布上,但这个画布是有透明度的,透明度就是通过alpha值指定的。


区别:
1、restore的意义是把回退栈中的最上层画布状态出栈,恢复画布状态。restoreToCount(int count)的意义是一直退栈,直到指定层count做为栈顶,将此之前的所有动作都恢复。
2、所以无论哪种save方法,哪个FLAG标识,保存画布时都使用的是同一个栈
3、restore()与restoreToCount(int count)针对的都是同一个栈,所以是完全可以通用和混用的。

restore()

每当调用Restore()函数,就会把栈中最顶层的画布状态取出来,并按照这个状态恢复当前的画布,并在这个画布上做画。

1.这个画布状态包含画布的matrix(即translate、scale、rotate、skew)和clip的状态
2. 其实,你不取栈顶画布的话,你默认就在栈顶,你要想取栈顶第二个的话,需要Restore两次
3. 如果restore调用的次数大于save方法,会出错。

restoreToCount()

一个高效率的方法,直接定位到指定的那个save,每次save都会返回一个int值,通过restoreToCount(int),会直接返回到这个图层,同时,他之前的栈的图层将会全部出栈。

另clip

裁剪画布是利用Clip系列函数,通过与Rect、Path、Region取交、并、差等集合运算来获得最新的画布形状。除了调用Save、Restore函数以外,这个操作是不可逆的,一但Canvas画布被裁剪,就不能再被恢复!

clip的意思是在原来的canvas上裁切出一个区域,后续操作会反应在裁切出的区域上,如果或许操作超越了裁切区域,那么将不会显示

save(FLAG)

这里写图片描述
有关这两个标识的结论:
1、HAS_ALPHA_LAYER_SAVE_FLAG表示新建的bitmap画布在与上一个画布合成时,不会将上一层画布内容清空,直接盖在上一个画布内容上面。
2、FULL_COLOR_LAYER_SAVE_FLAG则表示新建的bimap画布在与上一个画布合成时,先将上一层画布对应区域清空,然后再盖在上面。
3、当HAS_ALPHA_LAYER_SAVE_FLAG与FULL_COLOR_LAYER_SAVE_FLAG两个标识同时指定时,以HAS_ALPHA_LAYER_SAVE_FLAG为主
4、当即没有指定HAS_ALPHA_LAYER_SAVE_FLAG也没有指定FULL_COLOR_LAYER_SAVE_FLAG时,系统默认使用FULL_COLOR_LAYER_SAVE_FLAG;

CLIP_TO_LAYER_SAVE_FLAG标识的结论:
1、CLIP_TO_LAYER_SAVE_FLAG意义是在新建bitmap前,先把canvas给裁剪,一旦画板被裁剪,那么其中的各个画布都会被受到影响。而且由于它是在新建bitmap前做的裁剪,所以是无法恢复的;
2、当CLIP_TO_LAYER_SAVE_FLAG与CLIP_SAVE_FLAG标识共用时,在调用restore()后,画布将被恢复

原创粉丝点击