关于imageview matrix
Matrix 是 Android SDK 提供的一个矩阵类,它代表一个 3 X 3 的矩阵
那么这 9 个浮点数的作用和意义是什么呢,从 Android 官方文档上看,它为这个数组中的每一个元素都定义了一个下标常量
如果我们将这个 float 排成直观的矩阵格式,那它将是下面这样子的
际上我们平常利用 Matrix 来进行 Translate(平移)、Scale(缩放)、Rotate(旋转)的操作,就是在操作着这个矩阵中元素的数值来达到我们想要的效果
从这我们可以看出这个 Matrix 结构中的每个参数发挥着如下作用:
- MTRANS_X、MTRANS_Y 同时控制着 Translate
- MSCALE_X、MSCALE_Y 同时控制着 Scale
- MSCALE_X、MSKEW_X、MSCALE_Y、MSKEW_Y 同时控制着 Rotate
- 从名称上看,我们可以顺带看出 MSKEW_X、MSKEW_Y 同时控制着 Skew
Scale缩放的控制
scale就是缩放,我们调用Matrix的setScale、preScale、postScale,实际在内部,就是通过修改MSCALE_X和MSCALE_Y来实现的。
Matrix提供了3中不同的方式来设置, setScale、preScale、postScale。
2.setScale、preScale、postScale的区别
(1)、setScale(sx,sy),首先会将该Matrix设置为对角矩阵,即相当于调用reset()方法,然后在设置该Matrix的MSCALE_X和MSCALE_Y直接设置为sx,sy的值
(2)、preScale(sx,sy),不会重置Matrix,而是直接与Matrix之前的MSCALE_X和MSCALE_Y值结合起来(相乘),M' = M * S(sx, sy)。
(3)、postScale(sx,sy),不会重置Matrix,而是直接与Matrix之前的MSCALE_X和MSCALE_Y值结合起来(相乘),M' = S(sx, sy) * M。
preScale和post都是与之前的Matrix结合起来,那它们之间又有什么区别呢?
(1)、preScale的执行顺序
ImageView imageView=(ImageView)findViewById(R.id.img);
Matrix matrix=new Matrix();
matrix.preScale(2, 2);//1
matrix.preTranslate(100,100);//2
imageView.setImageMatrix(matrix); float[] points=new float[]{0f,0f};
matrix.mapPoints(points);
Log.i(TAG, "matrix=("+matrix.toString());
Log.i(TAG, "(x,y) =("+points[0]+","+points[1]+")");
结果如下
matrix=(Matrix{[2.0, 0.0, 200.0][0.0, 2.0, 200.0][0.0, 0.0, 1.0]}
(x,y) =(200.0,200.0)
进行变换的顺序是先执行2,1
ImageView imageView=(ImageView)findViewById(R.id.img);
Matrix matrix=new Matrix();
matrix.preTranslate(100,0);//1
matrix.preScale(2, 2);//2
matrix.preTranslate(100,100);//3
imageView.setImageMatrix(matrix); float[] points=new float[]{0f,0f};
matrix.mapPoints(points);
Log.i(TAG, "matrix=("+matrix.toString());
Log.i(TAG, "(x,y) =("+points[0]+","+points[1]+")");
matrix=(Matrix{[2.0, 0.0, 300.0][0.0, 2.0, 200.0][0.0, 0.0, 1.0]}
(x,y) =(300.0,200.0)
进行变换的顺序是先执行3,2,1
即对于一个Matrix的设置中,所有pre是倒着向后执行的
(2)、postScale的执行顺序
ImageView imageView=(ImageView)findViewById(R.id.img);
Matrix matrix=new Matrix();
matrix.postScale(2, 2);//
matrix.postTranslate(100,100);//
imageView.setImageMatrix(matrix); float[] points=new float[]{0f,0f};
matrix.mapPoints(points);
Log.i(TAG, "matrix=("+matrix.toString());
Log.i(TAG, "(x,y) =("+points[0]+","+points[1]+")");
matrix=(Matrix{[2.0, 0.0, 100.0][0.0, 2.0, 100.0][0.0, 0.0, 1.0]}
(x,y) =(100.0,100.0)
进行变换的顺序是先执行1,2
ImageView imageView=(ImageView)findViewById(R.id.img);
Matrix matrix=new Matrix();
matrix.postTranslate(100,0);//
matrix.postScale(2, 2);//
matrix.postTranslate(100,100);//
imageView.setImageMatrix(matrix); float[] points=new float[]{0f,0f};
matrix.mapPoints(points);
Log.i(TAG, "matrix=("+matrix.toString());
Log.i(TAG, "(x,y) =("+points[0]+","+points[1]+")");
matrix=(Matrix{[2.0, 0.0, 300.0][0.0, 2.0, 100.0][0.0, 0.0, 1.0]}
(x,y) =(300.0,100.0)
进行变换的顺序是先执行1,2,3
即对于一个Matrix的设置中,所有post是顺着执行的
(3)、当pre和post交替出现的执行顺序
即对于一个Matrix的设置中,先执行所有的Per(从后往前),之后执行post(顺序)
最后可以得出结论,在对matrix该次变换之前的所有设置中,先检测有没有setScale,如果有,直接跳到setScale那一步开始执行变换,然后在倒着执行下面所有的pre...变换,在顺着执行所有post....的变换。所以在对Matrix变换设置的时候,一定要注意顺序,不同的顺序,会有不同的结果。
最新文章
- 点餐系统Sprint2总结
- android: DOC命令:查看后台运行的activity:
- python中的深拷贝和潜拷贝
- JNI环境变量——JNIEnv*的使用 &;&;配置jd环境变量
- SPRING IN ACTION 第4版笔记-第九章Securing web applications-001-SpringSecurity简介(DelegatingFilterProxy、AbstractSecurityWebApplicationInitializer、WebSecurityConfigurerAdapter、@EnableWebSecurity、@EnableWebMvcS)
- 用jQuery 处理XML-- jQuery与XML
- Middleware开发入门
- Java历程-初学篇 Day03扫描仪与类型转换
- Jar程序使用MyBatis集成阿里巴巴druid连接池
- jeecg入门操作—模板配置(录入界面)
- (整理)Sublime Text 3 安装、破解、安装Package Control、汉化、添加到右键菜单、代码格式化、禁止更新
- python 随机数模块 -- random
- [转]Java NIO 系列教程
- POJ3046选蚂蚁创建集合_线性DP
- swift和oc的protocol的成员变量
- mongo_action
- mac版 android studio问题解决
- jQuery学习-键盘事件
- 个性化你的Git Log的输出格式
- javascript数组元素的添加、删除与插入以及参数数组的使用
热门文章
- kaggle gradient_descent
- CodeForces 404C Restore Graph (构造)
- [译]Javascript基础
- C++中四种强制类型转换区别详解
- win8使用every'thing无法显示搜索结果的解决方法
- 移动端自适应个人理解与收集——rem
- XCode9: iPhone is busy: Preparing debugger support for iPhone
- Oracle SQL判断字符串是否在目标字符串中的函数
- SpringBoot浏览器直接访问html
- k8s标签