• 一起Talk Android吧(第四百零六回:管理画布canvas)



    各位看官们,大家好,上一回中咱们说的例子是"画布的变换"的例子,这一回中咱们介绍的例子是" 管理画布"。闲话休提,言归正转,让我们一起Talk Android吧!

    看官们,我们在一章回中介绍了如何变换画布,如果对画布进行了多次的变换,那么需要对画布做管理,本章回中将介绍如何管理画布。

    使用原因

    我们使用的画布坐标默认为屏幕原点(0,0)坐标,如果对画布变换后,新画布的坐标就不再是默认的坐标,以后在画布上的任何控件,都会把新画布的坐标当作原点坐标。

    举个简单的例子,我们把画布沿x轴方向平移100dp,然后在新画布上画一条沿x轴方向(start x=0,end x =100,start y = end y = 10)的直线,此时的屏幕效果为:在屏幕坐标(100,10)处有一条沿x轴方向的直线,大家可以看到,直线虽然是从坐标点(0,10)开始画的,但是它显示的效果却是从坐标点(100,10)开始的,其原因主是直线所有画布进行了平移,进而导致画布上其它绘制操作的坐标发生了变化。

    如果大家不理解的话,可以自己动手去实践下。这个是专业的例子,我们再举一个生活中的例子:你坐着车向前走,自己虽然没有走路,但是车会带着你走路,你相对地面来说仍然是向前走的,例子里的车类似我们画图时的画布,即使画布上的控件不变,但是画布的更换会带着画布上的控件发生变换。

    管理方法

    我们对画布的管理方法是使用缓冲,具体操作为:变换画布前把画布状态保存到缓冲区中,画布变换操作完成后再从缓冲区中恢复画布原来的状态。系统为我们提供了相关的方法来保存和恢复画布状态,示例代码如下:

    //保存画布
    canvas.save();
    //变换画布
    canvas.XXX
    //恢复画布
    canvas.restore();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    原理分析

    系统对画布的保存和恢复通过栈实现,因此管理画布背后的原理为:先进后出

    保存画布操作相当于入栈操作,恢复画布操作相当于出栈操作。所有画布都使用先进后出的方法进行管理。

    此外,在个别情况下,需要特殊处理时可以把某个画布单独拿出来使用,此时可以使用canvas.restoreToCount()方法,该方法的参数就是第n个画布,也可以理解为栈中的某个画布。

    看官们,关于Android中"管理画布"的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

  • 相关阅读:
    【单细胞高级绘图】08.细胞通讯_两组比较_气泡图
    Spring常见的三种getBean的API
    MySQL数据库(基础)——期末复习总结
    SpringMVC:整合SSM
    Jenkins配置linux节点
    【C++】C++11 ——— 类的新功能
    批流一体数据集成框架ChunJun数据传输模块详解分享
    [oeasy]python0021_python虚拟机的位置_可执行文件_转化为字节形态
    浅谈微服务-SpringCloud以及框架发展史
    Maven第一章:Maven安装、验证、使用
  • 原文地址:https://blog.csdn.net/talk_8/article/details/127712310