【Android UI】Canvas 画布 ⑧ ( Canvas 绘图坐标系 2x2 矩阵 | Canvas 绘图坐标系 3x3 操作矩阵 )
文章目录
Canvas 状态保存机制 中 , 存在两个栈结构 , 分别是 状态栈 和 图层栈 ;
其中 图层栈 又称为 Layer 栈 ;
Canvas 画布中 , 有 2 套坐标系 , 分别是 :
- Canvas 自身坐标系
- Canvas 绘图坐标系
一、Canvas 绘图坐标系 2x2 矩阵
在 Canvas 绘制矩形的过程中 , 最终调用的是 BaseCanvas#nDrawRect 方法 ,
private static native void nDrawRect(long nativeCanvas, float left, float top, float right,
float bottom, long nativePaint);
最终的 左上右下 Canvas 绘图坐标系 中的坐标数据 , 也就是上述 BaseCanvas#nDrawRect 方法的 float left, float top, float right, float bottom
参数 , 会被转为一个
的 Matrix 矩阵 ;
该
的 Matrix 矩阵 用于存储 Canvas 绘图坐标系 ;
Canvas 绘图坐标系 可以通过调用 Canvas#translate 平移 , Canvas#rotate 旋转 , Canvas#scale 缩放 , Canvas#skew 扭曲斜拉 等方法 进行改变 ;
二、Canvas 绘图坐标系 3x3 操作矩阵
Canvas#translate 平移 , Canvas#rotate 旋转 , Canvas#scale 缩放 , Canvas#skew 扭曲斜拉 等操作数据 , 会被封装到一个
的 Matrix 矩阵 中 , 该矩阵中有 9 个参数 , 用于记录上述 4 种操作数值 :
- cosX -sinX translateX
- sinX cosX translateY
- 0 0 scale
其中 sinX 和 cosX 表示 Canvas#rotate 旋转角度的 正弦和余弦值 , 顺时针旋转为正 ;
translateX 和 translateY 分别表示 X 轴 和 Y 轴平移的值 ;
scale 表示 Canvas 画布缩放值 ;
调用 Canvas#getMatrix 方法 , 可获取上述
的 Matrix 矩阵 , 该方法原型如下 :
/**
* 返回一个新矩阵和画布当前变换矩阵的副本。
*
* @deprecated {@link #isHardwareAccelerated() 硬件加速的}
* 画布在传递到视图或可绘制时可能有任何矩阵,
* 因为它是在层次结构中创建此类画布的位置由实现定义的。
* 在这种情况下,建议绘制内容而不考虑当前矩阵,或跟踪画布之外的相关变换状态。
*/
@Deprecated
public final @NonNull Matrix getMatrix() {
Matrix m = new Matrix();
//noinspection deprecation
getMatrix(m);
return m;
}
上述 Canvas#translate 平移 , Canvas#rotate 旋转 , Canvas#scale 缩放 , Canvas#skew 扭曲斜拉 等操作的
的 Matrix 矩阵
会与
代表 Canvas 绘图坐标系的
的 Matrix 矩阵
进行运算 , 最终得到一个 新的 Canvas 绘图坐标系 ;
相关文章
- Android 12 还没用上,Android 13 已经来了!
- android系统开机画面_Android开机画面
- android bindservice方法,Android bindservice方法返回false
- 十款最实用的Android UI设计工具
- android短信验证码方案,Android之短信验证码
- Android resource linking failed_android sdk location should not
- android进程间通信的方式_Android进程注入
- Android Foreground Service
- android 系统浏览器 源码-Android 最最最简单的浏览器代码
- 【Android 电量优化】JobScheduler 源码分析 ( JobServiceContext 源码分析 | 闭环操作总结 | 用户提交任务 | 广播接收者接受相关广播触发任务执行 )★
- 【错误记录】p7zip 交叉编译 Android 版本 NDK 报错 ( error: case value evaluates to -2 , which cannot be narrowed )
- 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 二 )
- 【错误记录】Android Studio 编译报错 ( Could not find com.android.tools.build:gradle:4.2.1. )
- 【Android 逆向】Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | Visual Studio 中 SDK 和 NDK 安装位置 )
- 【错误记录】编译 Android 版本的 ijkplayer 报错 ( You must define ANDROID_NDK before starting. | 下载指定版本 NDK )
- 【Android Gradle 插件】Gradle 依赖管理 ② ( build.gradle 中的 dependencies 依赖配置 | DependencyHandler#add 方法介绍 )
- 【Android UI】Canvas 画布 ② ( Canvas 状态栈 | Canvas#restoreToCount 状态栈出栈到指定层级 )
- 关于Android的UI测试详解手机开发
- Android实现PHP连接MySQL进行数据交互(android通过php连接mysql)
- Android文件操作方法
- Android中的android:layout_weight使用详解
- 在android中实现类似uc和墨迹天气的左右拖动效果
- Android提高之BroadcastReceiver实例详解
- Android开发之广播机制浅析