Canvas和其绘制目标小结

来源:互联网 发布:英雄无敌5mac作弊 编辑:程序博客网 时间:2024/06/05 18:30

       Canvas是一个绘制的工具,分为硬件Canvas和软件Canvas,通过使用Canvas的方法可以将点(图形)绘制到指定目标中(即通常所说的画布,canvas中持有画布的引用),绘制目标有几种,待会介绍。

       Canvas的绘制指令:这些最常用的指令由一系列名为drawXXX()的方法提供。它们用来实现实际的绘制行为,例如绘制点、线、面,文字。

       Canvas的辅助指令:与绘制指令的区别是,执行辅助指令后产生的变化会对绘制产生持续的影响,直到使用canvas.restore()或canvas.restoreToCount()恢复到执行该辅助指令前的状态(所以若在之后需要恢复到当前节点,需要使用int count = canvas.save())。如坐标变换,裁剪区域。而变换是基于原来的变换基础上变换的,所以变换效果是叠加的,如果一直没有restore的话。

       绘制目标:就是要绘制的数据保存的地方。对软件Canvas来说,其绘制目标是建立在Surface之上的bitmap(即在Surface的内存中创建一个bitmap)。对于硬件Canvas来说,绘制目标有两种,一种是HardwareLayer,另一种是DisplayList。Hardwarelayer是一个硬件加速下的Bitmap。而DisplayList,与Bitmap和HardwareLayer不同,它不是一块Buffer,而是指令序列,大概就是根据Canvas的各种辅助指令和绘制指令序列通过某个过程优化保存到DisplayList中(因为特定的指令序列应该是可以优化成更好的指令序列的),而不是在调用Canvas的绘制指令就绘制到内存中直接作为图片数据,这就是硬件Canvas和软件Canvas最大的区别,还有一个区别就是每个子控件都有一个DisplayList,每个ViewGroup也有一个DisplayList,ViewGroup的所有子控件的DisplayList会绘制到其父控件的DisplayList上。所以对于DisplayList来说,它的最大优势在要复制或者增加重复利用率的时候,不重复利用的这个DisplayList的话其实过程比软件绘图更复杂,也更耗资源。

0 0