在创建新的控件或修改现有的控件时,我们都会涉及到重写控件或View的onDraw方法。

onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布。

在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢?

❑ save:用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。

❑ restore:用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。

save和restore要配对使用(restore可以比save少,但不能多),如果restore调用次数比save多,会引发Error。

例如:我们先想在画布上绘制一个右向的三角箭头,当然,我们可以直接绘制,另外,我们也可以先把画布旋转90°,画一个向上的箭头,然后再旋转回来(这种旋转操作对于画圆周上的标记非常有用)。然后,我们想在右下角有个20像素的圆,那么,onDraw中的核心代码是:

int px = getMeasuredWidth();

int py = getMeasuredWidth();

// Draw background

canvas.drawRect(0, 0, px, py, backgroundPaint);

canvas.save();

canvas.rotate(90, px/2, py/2);

// Draw up arrow

canvas.drawLine(px / 2, 0, 0, py / 2, linePaint);

canvas.drawLine(px / 2, 0, px, py / 2, linePaint);

canvas.drawLine(px / 2, 0, px / 2, py, linePaint);

canvas.restore();

// Draw circle

canvas.drawCircle(px - 10, py - 10, 10, linePaint);

效果如图1所示:

图1

如果我们不调用save和restore会是什么样子呢?如图2所示:

图2

从这两个图中,我们就能看到圆圈位置的明显差异。不进行Canvas的save和restore操作的话,所有的图像都是在画布旋转90°后的画布上绘制的。当执行完onDraw方法,系统自动将画布恢复回来。save和restore操作执行的时机不同,就能造成绘制的图形不同。

所以,save和restore之间,往往夹杂的是对Canvas的特殊操作。

Canvas的save和restore相关推荐

  1. canvas中save和restore的理解和使用

    canvas中save和restore的理解和使用 理解save和restore不一定总是成对出现的 太阳系 理解save和restore不一定总是成对出现的 每个 canvas 的 context ...

  2. 理解Canvas的save()和restore()方法

    save()和restore()方法是绘制复杂图形必不可少的方法.它们分别是用来保存和恢复 canvas 状态的,都没有参数. Canvas 状态是以堆(stack)的方式保存的,每一次调用 save ...

  3. Canvas的save和restore方法

    2019独角兽企业重金招聘Python工程师标准>>> Canvas里的两个重要方法,一直很疑惑. save和restore方法是成对出现的,但是restore必然对应一个save方 ...

  4. canvas 的save()和restore()方法

    应用到画布上面的效果是可以累积的,因而就可以利用几个简单的函数来"组合"出效果来.例如,在向屏幕上绘制之前,可能会有一艘飞船需要旋转.变换 和缩放.因为所有效果都对画布起作用,所以 ...

  5. Android画布的保存,Android canvas用法介绍之save()和restore()

    一. 首先讲一下canvas的save 和 restore功能. 这是canvas很有魅力的一个部分. onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布. 在onDraw方 ...

  6. canvas像素操作、save与restore、合成与变形

    一.canvas像素操作 (1)获取图像像素 (2)写入像素数据 (3)创建像素数据 (4)小案例,将canvasA画布的图像复制到canvasB中 二.canvas的save与restore 三.c ...

  7. canvas理解:一看就懂的save和restore

    一看就懂的save和restore 对于save()和restore()方法,我一开始有一个错误的理解,以为每一步都save()之后restore()就等同于command + z(或者ctrl + ...

  8. Tensorflow: 保存和复原模型(save and restore)

    报错: is not valid checkpoint 解决: module_file = tf.train.latest_checkpoint(diag_obj.save_path) saver.r ...

  9. A quick complete tutorial to save and restore Tensorflow models

    In this Tensorflow tutorial, I shall explain: How does a Tensorflow model look like? How to save a T ...

最新文章

  1. cad怎么快速算面积_用cad算面积的快捷键方法步骤详细,大朗CAD培训班
  2. 一个人独立完成一个网站上线的前前后后
  3. MySQL用C访问的示例代码
  4. 极客大学架构师训练营 性能优化 性能测试指标 性能测试 性能优化 CDN 网络 硬盘 缓存 异步 集群 第13课 听课总结
  5. 扩展GridView控件(3) - 根据按钮的CommandName设置其客户端属性
  6. 基于javaweb+springboot的电影售票系统(java+Springboot+ssm+mysql+jsp+maven)
  7. 微博千万级规模高性能高并发的网络架构设计
  8. 二阶系统响应指标图_自动控制理论_3.3 二阶系统的瞬态响应
  9. java 最大子段和问题,最大连续子数组和(最大子段和)
  10. php rgb转cmyk,php – 使用Imagick将图像从RGB转换为CMYK
  11. linux上java设置内存,linux 设置java内存
  12. EXCEL常见数据处理操作(一)
  13. 计算机快速格式化u盘启动,制作启动盘格式化u盘
  14. 60020:not allow to access from your ip
  15. 韩非子《五蠹》全文及译文
  16. 机器学习建模工具PyCaret详讲
  17. GP232RL:国产USB转串口/UART芯片替代FT232RL
  18. 管理学书籍推荐:这10本优秀的管理类书籍最值得一读
  19. 东北大学OJ-1224: 实验4-6 :存款利息的计
  20. xtwpro2编程器_XTW100编程器驱动下载

热门文章

  1. Android 升级到android studio 2.2项目死活run不起来
  2. 一键安装lamp脚本--初级版
  3. Android Json 解析
  4. uva10160(dfs+状态压缩)
  5. 学计算机学体育生闺女,古力:生个女儿一定学围棋 生个儿子就去踢足球
  6. PHP判断客户端的浏览器类型
  7. JavaScript方法
  8. RabbitMQ是如何运转的?
  9. Codeforces 1066 C(思维)
  10. Public DNS (公共域名解析服务)