前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【Android UI】Canvas 画布 ④ ( Canvas 坐标系 | Canvas 自身坐标系 | Canvas 绘图坐标系 )

【Android UI】Canvas 画布 ④ ( Canvas 坐标系 | Canvas 自身坐标系 | Canvas 绘图坐标系 )

作者头像
韩曙亮
发布于 2023-03-30 08:04:51
发布于 2023-03-30 08:04:51
1.6K0
举报

文章目录

Canvas 状态保存机制 中 , 存在两个栈结构 , 分别是 状态栈 和 图层栈 ;

其中 图层栈 又称为 Layer 栈 ;

Canvas 画布中 , 有 2 套坐标系 , 分别是 :

  • Canvas 自身坐标系
  • Canvas 绘图坐标系

一、Canvas 自身坐标系


Canvas 自身坐标系 , 指的是 自定义组件 View 或 SurfaceView 中 , 左上角位置是 坐标原点位置 (0 , 0) ,

  • X 轴 : 从 坐标原点位置 ( 左上角 ) 向右是 X 轴正半轴 , 向右为增加 ;
  • Y 轴 : 从 坐标原点位置 ( 左上角 ) 向下是 Y 轴正半轴 , 向下为增加 ;

二、Canvas 绘图坐标系


Canvas 绘图坐标系 的 坐标原点 位置 , 可以认为是 Paint 画笔开始绘画的位置 ;

Canvas 绘图坐标系 不是一成不变的 , 该 坐标系 与 Matrix 矩阵 相关 , 当矩阵发生变化时 , 绘图坐标系也会进行相应的改变 ;

Matrix 矩阵可以通过如下函数修改 :

  • Canvas#translate() : 平移画布
  • Canvas#rotate() : 旋转画布
  • Canvas#scale() : 缩放画布
  • Canvas#skew() : 扭曲画布

上述 Matrix 矩阵的变化是不可逆的 , 因此这里需要保存 Matrix 矩阵变化前后的状态 , 状态栈 就是用于保存这种变化的数据结构 ;

Canvas 的 状态栈 , 通过如下函数 , 进行保存和还原 Matrix 矩阵 ;

  • 通过 Canvas#save() 函数 , 保存 Matrix 矩阵的变换操作 ;
  • 通过 Canvas#restore() 函数, 还原 Matrix 矩阵的变换操作 ;
  • 通过 Canvas#restoreToCount() 函数, 还原到之前的某个 Matrix 矩阵的变换操作 ;

调用 Canvas#save() 函数 保存 Matrix 矩阵变化操作 , 调用 Canvas#restore() 函数 还原 Matrix 矩阵变化操作 ;

状态栈 保存的信息如下 :

  • Matrix 矩阵
  • Layer 图层

Canvas 的 图层栈 , 通过调用 Canvas#saveLayer() 函数 , 创建新的透明图层 , 后续的绘图操作都在该新图层中执行 , 调用 Canvas#restore() 或 Canvas#restoreToCount() 函数 后 , 在该图层绘制的内容才会 更新到 Canvas 画布中 ;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android自定义系列——4.Canvas操作
1.画布操作 为什么要有画布操作? 画布操作可以帮助我们用更加容易理解的方式制作图形。 ⑴位移(translate) translate是坐标系的移动,可以为图形绘制选择一个合适的坐标系。 请注意,位移是基于当前位置移动,而不是每次基于屏幕左上角的(0,0)点移动,如下:
老马的编程之旅
2022/06/22
8630
​canvas 高级功能(上)
在本文中,你将学习到 Canvas 提供的一些更高级的功能。你将看到在使用多种绘图样式时如何节省时间,以及如何转换和操作绘图来使其更激动人心。本文内容非常精彩,我希望这些内容能够拓宽你的眼界,帮助你学会画布的高级功能。
用户8921923
2022/10/24
2K0
​canvas 高级功能(上)
【Android UI】Canvas 画布 ② ( Canvas 状态栈 | Canvas#restoreToCount 状态栈出栈到指定层级 )
Canvas 状态保存机制 中 , 存在两个栈结构 , 分别是 状态栈 和 图层栈 ;
韩曙亮
2023/03/30
5140
【Android UI】Canvas 画布 ② ( Canvas 状态栈 | Canvas#restoreToCount 状态栈出栈到指定层级 )
【Android UI】Canvas 画布 ⑤ ( Canvas 坐标系 | Canvas 绘图坐标系变换示例 )
Canvas 状态保存机制 中 , 存在两个栈结构 , 分别是 状态栈 和 图层栈 ;
韩曙亮
2023/03/30
1.4K0
【Android UI】Canvas 画布 ⑤ ( Canvas 坐标系 | Canvas 绘图坐标系变换示例 )
Android画布Canvas--save方法和saveLayer方法的区别
Canvas里面牵扯两种坐标系:Canvas自己的坐标系、绘图坐标系,当Canvas画布被创建时,Canvas的坐标系就被创建了,并且此坐标系是固定不变的,就是(0,0)到Canvas的宽高,而我们使用Canvas的平移,旋转等方法时实际上操作的是绘图坐标系 Canvas的坐标系 它就在View的左上角,做坐标原点往右是X轴正半轴,往下是Y轴的正半轴,有且只有一个,唯一不变 绘图坐标系 它不是唯一不变的,它与Canvas的Matrix有关系,当Matrix发生改变的时候,绘图坐标系对应的进行改变,同时这
aruba
2020/07/03
2K0
【Android UI】Canvas 画布 ⑨ ( Canvas 绘图坐标系平移实例 )
Canvas 状态保存机制 中 , 存在两个栈结构 , 分别是 状态栈 和 图层栈 ;
韩曙亮
2023/03/30
9540
【Android UI】Canvas 画布 ⑨ ( Canvas 绘图坐标系平移实例 )
Canvas学习系列二:Canvas的坐标系统
版权声明:本文为原创文章发布于公众号:Modeng , 你可以随意转载但请务必注明出处!!! https://blog.csdn.net/qq_32135281/article/details/73163489
六小登登
2018/09/17
6.4K0
Canvas学习系列二:Canvas的坐标系统
【Android UI】Canvas 画布 ① ( Canvas 状态栈 | Canvas 状态栈入栈与出栈 | 获取 Canvas 状态栈容量 | Canvas 状态栈原点数据 )
Canvas 状态保存机制 中 , 存在两个栈结构 , 分别是 状态栈 和 图层栈 ;
韩曙亮
2023/03/30
7110
【Android UI】Canvas 画布 ① ( Canvas 状态栈 | Canvas 状态栈入栈与出栈 | 获取 Canvas 状态栈容量 | Canvas 状态栈原点数据 )
【Android UI】Canvas 画布 ③ ( Canvas 图层栈 | Canvas#saveLayer() 新建图层 | Canvas 状态栈保存信息标志位 )
Canvas 状态保存机制 中 , 存在两个栈结构 , 分别是 状态栈 和 图层栈 ;
韩曙亮
2023/03/30
8070
自定义 View 系列(一)-坐标系和视图坐标系
View是Android所有控件的基类,接下来借鉴网上的一张图片让大家一目了然(图片出自:http://blog.51cto.com/wangzhaoli/1292313)
Android技术干货分享
2019/03/26
9430
自定义 View 系列(一)-坐标系和视图坐标系
Android关于Canvas你所知道的和不知道的一切
Picture相当于先拍一张照片,并且是在别的Canvas上,在别的Canvas上,在别的Canvas上! 重要的话说三遍:当需要的时候在贴在当前的canvas上,picture绘制的优势就是节能减排 当有大量复杂内容需要复用,Picture这个的canvas元件是不二的选择:
张风捷特烈
2018/12/06
3.4K0
Android关于Canvas你所知道的和不知道的一切
Android自定义View【实战教程】5⃣️---Canvas详解及代码绘制安卓机器人
Android自定义View【实战教程】3⃣️—-Paint类、Path类以及PathEffect类详解
先知先觉
2019/01/21
1.4K0
【Android 应用开发】Android 组件 位置坐标 属性 ( 组件位置属性 | 父容器坐标系坐标 | 窗口坐标系坐标 | 屏幕坐标系坐标 | 触摸坐标 )
left , top , right , bottom 是组件相对于父容器的位置 , 该值一般不会改变 ;
韩曙亮
2023/03/27
4K0
探究 canvas 绘图中撤销(undo)功能的实现方式
最近在做网页版图片处理相关的项目,也算是初入了 canvas 的坑。项目需求中有一个给图片添加水印的功能。我们知道,在浏览器端实现图片添加水印功能,通常的做法就是使用 canvas 的 drawImage 方法。对于普通的合成(比如一张底图和一张 PNG 水印图片合成)来说,其大致实现原理如下:
逆葵
2019/04/25
2.2K0
探究 canvas 绘图中撤销(undo)功能的实现方式
iOS坐标系探究
APP 在渲染视图时,需要在坐标系中指定绘制区域。这个概念看似乎简单,事实并非如此。
落影
2018/11/01
2.8K0
自定义控件详解(三):Canvas效果变换
Canvas 画布 从前面我们已经知道了 Canvas 类可以绘出 各种形状。 这里学习一下Canvas 类的变换效果(平移,旋转等) 首先需要了解一下Canvas 画布, 我们用Canvas.DrawXXX()方法的时候并不是在一张画布上进行绘制。而是每次调用.DrawXXX()方法,都会生成一个新的画布并在上面绘制,这就类似于PS中的图层。 从下面会看到解释。 一、偏移(.translate)       即让画布平移,之后上面的绘制操作也会跟着平移 public void translate(floa
听着music睡
2018/06/08
8570
6.4 Android绘图技巧(Primary:四大方法&Layer)
创建一个新的Layer到“栈”中,可以使用saveLayer(), savaLayerAlpha(), 从“栈”中推出一个Layer,可以使用restore(),restoreToCount()。但Layer入栈时,后续的DrawXXX操作都发生在这个Layer上,而Layer退栈时,就会把本层绘制的图像“绘制”到上层或是Canvas上,在复制Layer到Canvas上时,可以指定Layer的透明度
凌川江雪
2018/09/13
6630
6.4  Android绘图技巧(Primary:四大方法&Layer)
Android--Camera基本用法
在我们处理canvas平移,缩放等矩阵matrix变换中,除了自己手动操作矩阵matrix外,安卓系统还提供了一个工具类--Camera,用于3D变换计算,生成一个Matrix矩阵实例用于画布上面绘制
aruba
2020/07/02
7910
坐标系统仿射变换函数使用总结
Mac的AppKit坐标系统是已左下角为坐标原点,向右为X轴正向,向上为Y轴正向。
SheltonWan
2019/06/11
1.4K0
坐标系统仿射变换函数使用总结
6_相机坐标系_相机4个坐标系详述
相机系列文章是用来记录使用opencv3来完成单目相机和6轴机械臂手眼标定。本人吃饭的主职是linux下6轴机械臂相关应用开发。但对于机械臂运动学、相机应用等都非常感兴趣,所以对一些线性代数基础薄弱又想深入了解机械臂内部运算的同志比较有体会。由于是探索性学习,所以文章并没有太多规律而言,更像是技术路线调整,但这更贴近实际。探索事物本质是快乐的,强者不是天生的,而是学习思考来的。
用户5908113
2024/03/27
4730
6_相机坐标系_相机4个坐标系详述
推荐阅读
相关推荐
Android自定义系列——4.Canvas操作
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文