关于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变换设置的时候,一定要注意顺序,不同的顺序,会有不同的结果。
关于imageview matrix的更多相关文章
- Android 移动缩放的ImageView
今天介绍一下Android中怎么实现ImageView的缩放和移动,自定义TouchImageView. public class TouchImageView extends ImageView { ...
- 自定义ImageView
package com.example.myimageview; import android.content.Context;import android.graphics.Bitmap;impor ...
- Android 自定义ImageView支持缩放,拖拽,方便复用
今天刚发了一篇关于ImageView的缩放和拖拽的博客,然后我想了下,将他自定义下,方便我们来复用这个imageView,效果我就不多说了,http://blog.csdn.net/xiaanming ...
- Graphics简单汇总
1.主页面布局文件 activity_main.xml(仅仅有2个button按钮) <?xml version="1.0" encoding="utf-8&quo ...
- Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix
MainActivity如下: import android.os.Bundle; import android.view.MotionEvent; import android.view.View; ...
- Bitmap与Matrix旋转ImageView
Bitmap与Matrix旋转ImageView 标签: matrixfloatbutton测试importlayout 2010-08-23 22:18 8569人阅读 评论(0) 收藏 举报 分 ...
- Android图片旋转,缩放,位移,倾斜,对称完整演示样例(一)——imageView.setImageMatrix(matrix)和Matrix
MainActivity例如以下: import android.os.Bundle; import android.view.MotionEvent; import android.view.Vie ...
- Matrix: 利用Matrix来设置ImageView的宽高,使图片能正常显示
在Android中加载ImageView一般都不会给ImageView的宽高设置一个确切的值,一般都是直接写成: <ImageView android:id="@+id/iv_test ...
- ImageView缩放选项
ImageView.ScaleType 将图片边界缩放到所在view边界时的缩放选项. Options for scaling the bounds of an image to the bounds ...
随机推荐
- 创建Mat对象
Mat 是一个非常优秀的图像类,它同时也是一个通用的矩阵类,可以用来创建和操作多维矩阵.有多种方法创建一个 Mat 对象. 1.构造函数方法 下面是一个使用构造函数创建对象的例子. 常用的构造函数 2 ...
- Sql Server将一列字段拼接成字符串方法
最近在项目中遇到个问题,需要将表中某列字段合并成字符串输出,如果直接通过代码全部读取出来,再遍历进行拼接显然不是最好的方法,所以想着能否在数据读取的时候直接拼接好返回,网上搜了可通过for xml来实 ...
- 动态合并GridView数据行DataRow的列
前段时间,Insus.NET一直在演示GridView控件Header头行或列:<动态变更GridView控件列名>和<动态合并或定制GridView控件Header头某些列> ...
- java中计算一段时间内白天的时间和夜晚的时间
之前,采用拼接字符串的形式,不断地在Date类型和Long类型之间转换,实在是太过于麻烦,后来采取了这种思路:假设我们将22:00 ~ 10:00 视为夜间时间,则我们先计算出10:00 相对于当天的 ...
- new types may not be defined in a return type(c++语言编译错误,处理)
在写程序的时候,定义类时要在大括号后面加上: class Point{ public: Point(int a,int b); Point(const Point &p); int getx( ...
- Jmeter-逻辑控制器之Switch控制器(Switch Controller)
Switch控制器(Switch Controller): 作用:Switch控制器通过给该控制器中的Value赋值,来指定运行哪个采样器.有两种赋值方式: 第一种是数值,Switch控制器下的子节点 ...
- Vue.js 60分钟快速入门
原文链接:http://www.cnblogs.com/keepfool/p/5619070.html Vue.js介绍 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和 ...
- 【NOIP 2011】Mayan游戏(搜索+模拟)
描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.**游戏通关是指在规定的步数 ...
- 数据结构8: 双向链表(双向循环链表)的建立及C语言实现
之前接触到的链表都只有一个指针,指向直接后继,整个链表只能单方向从表头访问到表尾,这种结构的链表统称为 “单向链表”或“单链表”. 如果算法中需要频繁地找某结点的前趋结点,单链表的解决方式是遍历整个链 ...
- Java实现微信小程序支付(准备)
Java语言开发微信小程序支付功能: 1.通过https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1路径到官方下载Java的支付SD ...