Android canvas save restore saveLayer的异同点

2024-09-06 07:48

本文主要是介绍Android canvas save restore saveLayer的异同点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、基础操作 drawText、drawRect、drawColor等

对于这些基础操作,相信每一个安卓开发者都能说上个一二点出来,这些就不多做介绍,api 工程师必备技能之一。 在进阶之前,先回答这个问题:

   问:canvas既然大家都理解为画布,那如果先在画布上绘制了某些内容,然后再canvas.rotate旋转了画布,为什么这些已经绘制在画布上的内容不会跟随着旋转?
   答:由此可见,canvas并不能简单理解为画布。 它是用于在手机屏幕上作画的,类似尺规作图的一套规则。

二、canvas.rotate(float degrees)理解

canvas.rotate(float degrees)用于将画布以坐标原点为中心,顺时针旋转指定的角度。 后续的所有操作是基于旋转之后的坐标系进行操作的。

三、canvas.rotate(float degrees, float px, float py)理解

在 canvas.rotate(float degrees)的基础上,若不希望以坐标原点为中心来旋转,而希望以自己指定的点为 旋转中心则可以使用直方法。 同理,旋转后的所有操作是基于此新的坐标系。
如下图:rotate(90, 20, 10)操作后,新的坐标系原点为(0',0'),横轴为x轴',纵轴为y轴'。 导致与手机屏幕的横纵相反。
注意: 这里并不是说指定的点为坐标原点,而是说指定旋转的中心点,旋转完成后,这个中心点再也没有任何作用。
在这里插入图片描述

五、save()、restore()

在理解save()、restore()作用之前,先来看一个场景:假设某一个图案需要经过以下几个步骤来绘制
1、在初始坐标系上先绘制一些文字
2、旋转画布45度,在新坐标系上再绘制一些文字
3、再在初始坐标系上绘制另一些文字
对于这个案例,可能有同学会有疑问,
疑问一:为什么不在第1步中将 第1步和第3步需要的文字绘制完成呢? 因为某些图案可能存在上下覆盖的关系,另外纯粹从技术探讨阶段,我们更不应该偷机取巧 想着简单。
疑问二:在第3步再将画布旋转-45度,即反向旋转回去不就可以了吗?这当然是方法之一,假如第2步的坐标系操作再复杂一些,例如经过 3步旋转、4步平移、5步缩放,再按原来的步骤顺序 反向变换回去,这工作量是非常大的。 这种场景就可以使用 save()、restore()。

结论(精华):

1、save() 用于保存代码执行到 canvas.save() 这一行时的 坐标系状态(这里记为 坐标系 A), 在save之后无论经过多少步坐标系变换,只要调用canvas.restore(),就能立即回到 坐标系 A 状态。 这对于一些复杂图案的坐标系维护非常有帮助,大大减小了开发工作量。
2、save和restore需要成对出现,每一个restore用于回到最近的一次save的状态。(最近表示代码执行顺序上的最近)

六、saveLayer()

保存坐标系当前的坐标系,并产生新的图层,之后的绘制操作只会在新图层上生成图像。直到调用restore()时,将新的图层内容 合并到 原始图层上。

  1. MATRIX_SAVE_FLAG标识的结论:
    • 当save\saveLayer调用Canvas.MATRIX_SAVE_FLAG标识时只会保存画布的位置矩阵信息,在canvas.restore()时也只会恢复位置信息,而改变过的画布大小是不会被恢复的。
    • 当使用canvas.saveLayer(Canvas.MATRIX_SAVE_FLAG)时,需要与Canvas.HAS_ALPHA_LAYER_SAVE_FLAG一起使用,不然新建画布所在区域原来的图像将被清空。(后面会讲原因)
  2. CLIP_SAVE_FLAG标识的结论来了:
    • 当save/saveLayer调用 Canvas.CLIP_SAVE_FLAG时只会保存画布的裁剪信息,在canvas.restore()时也只会恢复裁剪信息,而改变过的画布位置信息是不会被恢复的。
    • 当使用canvas.saveLayer(Canvas.CLIP_SAVE_FLAG)时,需要与Canvas.HAS_ALPHA_LAYER_SAVE_FLAG一起使用,不然新建画布所在区域原来的图像将被清空。
  3. ALL_SAVE_FLAG
    • 对于save(int flag)来讲,ALL_SAVE_FLAG = MATRIX_SAVE_FLAG | CLIP_SAVE_FLAG;即保存位置信息和裁剪框大小信息
    • 对于saveLayer(int flag)来讲,ALL_SAVE_FLAG = MATRIX_SAVE_FLAG | CLIP_SAVE_FLAG|HAS_ALPHA_LAYER_SAVE_FLAG;即保存保存位置信息和裁剪信息,新建画布在与上一层画布合成时,不清空原画布内容。

这篇关于Android canvas save restore saveLayer的异同点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141432

相关文章

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

基于Canvas的Html5多时区动态时钟实战代码

《基于Canvas的Html5多时区动态时钟实战代码》:本文主要介绍了如何使用Canvas在HTML5上实现一个多时区动态时钟的web展示,通过Canvas的API,可以绘制出6个不同城市的时钟,并且这些时钟可以动态转动,每个时钟上都会标注出对应的24小时制时间,详细内容请阅读本文,希望能对你有所帮助...

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤