android matrix
2015-06-01 15:53
489 查看
Matrix,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放、平移、旋转等操作。
首先介绍一下矩阵运算。加法和减法就不用说了,太简单了,对应位相加就好。图像处理,主要用到的是乘法。下面是一个乘法的公式:
![](http://img.blog.csdn.net/20150601155345639?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTYyNTc2OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
在Android里面,Matrix由9个float值构成,是一个3*3的矩阵。如下图。
![](http://img.blog.csdn.net/20150601155534928?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTYyNTc2OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
没专业工具,画的挺难看。解释一下,上面的sinX和cosX,表示旋转角度的cos值和sin值,注意,旋转角度是按顺时针方向计算的。translateX和translateY表示x和y的平移量。scale是缩放的比例,1是不变,2是表示缩放1/2,这样子。
下面在Android上试试Matrix的效果。
运行结果如下:
![](http://img.blog.csdn.net/20150601161151100?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTYyNTc2OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
以左上角为顶点,缩放一半,逆时针旋转30度,然后沿x轴和y轴分别平移50个像素,代码 里面写的是100,为什么是平移50呢,因为缩放了一半。
大家可以自己设置一下Matrix的值,或者尝试一下两个Matrix相乘,得到的值设置进去,这样才能对Matrix更加熟练。
这里讲的直接赋值的方式也许有点不好理解,不过还好,andrid提供了对矩阵的更方便的方法
Android里面提供了对Matrix操作的一系列方便的接口。
Matrix的操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,每一种变换在
Android的API里都提供了set, post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。
set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。
post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。例如,要将一个图片旋
转30度,然后平移到(100,100)的地方,那么可以这样做:
Matrix matrix=new Matrix();
matrix.postRotate(30);
matrix.postTranslate(100,100);
这样就达到了想要的效果。
pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。例如上面的例子,如果用pre的话
Matrix matrix=new Matrix();
matrix.postTranslate(100,100);
matrix.preRotate(30);
旋转、缩放和倾斜都可以围绕一个中心点来进行,如果不指定,默认情况下,是围绕(0,0)点来进行
下面给出一个例子。
运行效果如下:
![](http://img.blog.csdn.net/20150601165452922?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTYyNTc2OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
红色的x和y表示倾斜的角度,下面是x,上面是y。看到了没,Matrix就这么简单。
抽象的说pre方法是向前"生长", post方法是向后"生长",具体拿个例子来说,比如一个matrix调用了下列一系列的方法:
matrix.preScale(0.5f, 1); matrix.preTranslate(10, 0); matrix.postScale(0.7f, 1); matrix.postTranslate(15, 0); 则坐标变换经过的4个变换过程依次是:
translate(10, 0) -> scale(0.5f, 1) -> scale(0.7f, 1) -> translate(15, 0),
所以对matrix方法的调用顺序是很重要的,不同的顺序往往会产生不同的变换效果。pre方法的调用顺序和post方法的互不影响,即以下的方法调用和前者在真实坐标变换顺序里是一致的, matrix.postScale(0.7f, 1); matrix.preScale(0.5f, 1); matrix.preTranslate(10, 0); matrix.postTranslate(15, 0);
而matrix的set方法则会对先前的pre和post操作进行刷除,而后再设置它的值,比如下列的方法调用:
matrix.preScale(0.5f, 1); matrix.postTranslate(10, 0); matrix.setScale(1, 0.6f); matrix.postScale(0.7f, 1); matrix.preTranslate(15, 0); 其坐标变换顺序是
translate(15, 0) -> scale(1, 0.6f) -> scale(0.7f, 1).
setScale重新设置了矩阵的值,之前的两个变换是无效的了,所以最终的显示效果只有三个变换效果。
Canvas里scale, translate, rotate, concat方法都是pre方法,如果要进行更多的变换可以先从canvas获得matrix, 变换后再设置回canvas.
Matrix的操作
Matrix的操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,每一种变换在Android的API里都提供了set, post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。
set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。
post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。例如,要将一个图片旋转30度,然后平移到(100,100)的地方,那么可以这样做。
Matrix m = new Matrix();
m.postRotate(30);
m.postTranslate(100, 100);
Matrix m = new Matrix();
m.postRotate(30); /////(p1)
m.postTranslate(100, 100); ////(p2)
=== (p1) (p2)m
(矩阵从左往右计算。。。)
这样就达到了想要的效果。
pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。例如上面的例子,如果用pre的话,就要这样:
Matrix m = new Matrix();
m.setTranslate(100, 100); ////p3
m.preRotate(30); ////p4
=== m(p4)(p3)
旋转、缩放和倾斜都可以围绕一个中心点来进行,如果不指定,默认情况下,是围绕(0,0)点来进行
首先介绍一下矩阵运算。加法和减法就不用说了,太简单了,对应位相加就好。图像处理,主要用到的是乘法。下面是一个乘法的公式:
在Android里面,Matrix由9个float值构成,是一个3*3的矩阵。如下图。
没专业工具,画的挺难看。解释一下,上面的sinX和cosX,表示旋转角度的cos值和sin值,注意,旋转角度是按顺时针方向计算的。translateX和translateY表示x和y的平移量。scale是缩放的比例,1是不变,2是表示缩放1/2,这样子。
下面在Android上试试Matrix的效果。
public class originalMatrix extends View { Matrix matrix = new Matrix(); Bitmap bitmap = null; public originalMatrix(Context context) { super(context); bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a); float cosValue = (float) Math.cos(-Math.PI / 6); float sinValue = (float) Math.sin(-Math.PI / 6); matrix.setValues( new float[] { cosValue, -sinValue, 100, sinValue, cosValue, 100, 0, 0, 2 }); } @Override public void draw(Canvas canvas) { super.draw(canvas); canvas.drawBitmap(bitmap, matrix, null); } }
运行结果如下:
以左上角为顶点,缩放一半,逆时针旋转30度,然后沿x轴和y轴分别平移50个像素,代码 里面写的是100,为什么是平移50呢,因为缩放了一半。
大家可以自己设置一下Matrix的值,或者尝试一下两个Matrix相乘,得到的值设置进去,这样才能对Matrix更加熟练。
这里讲的直接赋值的方式也许有点不好理解,不过还好,andrid提供了对矩阵的更方便的方法
Android里面提供了对Matrix操作的一系列方便的接口。
Matrix的操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,每一种变换在
Android的API里都提供了set, post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。
set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。
post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。例如,要将一个图片旋
转30度,然后平移到(100,100)的地方,那么可以这样做:
Matrix matrix=new Matrix();
matrix.postRotate(30);
matrix.postTranslate(100,100);
这样就达到了想要的效果。
pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。例如上面的例子,如果用pre的话
Matrix matrix=new Matrix();
matrix.postTranslate(100,100);
matrix.preRotate(30);
旋转、缩放和倾斜都可以围绕一个中心点来进行,如果不指定,默认情况下,是围绕(0,0)点来进行
下面给出一个例子。
public class simpleMatrix extends View { Matrix matrix = new Matrix(); Bitmap bitmap = null; public simpleMatrix(Context context) { super(context); bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a); // 100f/width 转换为浮点型,否则可能为0 matrix.setScale(100f / bitmap.getWidth(), 100f / bitmap.getHeight()); // 顺时针旋转30度 matrix.postTranslate(100, 100); // 以100 100 为中心 倾斜x 轴和Y 轴 matrix.postSkew(0.2f, 0.2f, 100, 100); } @Override public void draw(Canvas canvas) { super.draw(canvas); canvas.drawBitmap(bitmap, matrix, null); }
运行效果如下:
红色的x和y表示倾斜的角度,下面是x,上面是y。看到了没,Matrix就这么简单。
抽象的说pre方法是向前"生长", post方法是向后"生长",具体拿个例子来说,比如一个matrix调用了下列一系列的方法:
matrix.preScale(0.5f, 1); matrix.preTranslate(10, 0); matrix.postScale(0.7f, 1); matrix.postTranslate(15, 0); 则坐标变换经过的4个变换过程依次是:
translate(10, 0) -> scale(0.5f, 1) -> scale(0.7f, 1) -> translate(15, 0),
所以对matrix方法的调用顺序是很重要的,不同的顺序往往会产生不同的变换效果。pre方法的调用顺序和post方法的互不影响,即以下的方法调用和前者在真实坐标变换顺序里是一致的, matrix.postScale(0.7f, 1); matrix.preScale(0.5f, 1); matrix.preTranslate(10, 0); matrix.postTranslate(15, 0);
而matrix的set方法则会对先前的pre和post操作进行刷除,而后再设置它的值,比如下列的方法调用:
matrix.preScale(0.5f, 1); matrix.postTranslate(10, 0); matrix.setScale(1, 0.6f); matrix.postScale(0.7f, 1); matrix.preTranslate(15, 0); 其坐标变换顺序是
translate(15, 0) -> scale(1, 0.6f) -> scale(0.7f, 1).
setScale重新设置了矩阵的值,之前的两个变换是无效的了,所以最终的显示效果只有三个变换效果。
Canvas里scale, translate, rotate, concat方法都是pre方法,如果要进行更多的变换可以先从canvas获得matrix, 变换后再设置回canvas.
Matrix的操作
Matrix的操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,每一种变换在Android的API里都提供了set, post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。
set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。
post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。例如,要将一个图片旋转30度,然后平移到(100,100)的地方,那么可以这样做。
Matrix m = new Matrix();
m.postRotate(30);
m.postTranslate(100, 100);
Matrix m = new Matrix();
m.postRotate(30); /////(p1)
m.postTranslate(100, 100); ////(p2)
=== (p1) (p2)m
(矩阵从左往右计算。。。)
这样就达到了想要的效果。
pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。例如上面的例子,如果用pre的话,就要这样:
Matrix m = new Matrix();
m.setTranslate(100, 100); ////p3
m.preRotate(30); ////p4
=== m(p4)(p3)
旋转、缩放和倾斜都可以围绕一个中心点来进行,如果不指定,默认情况下,是围绕(0,0)点来进行
相关文章推荐
- 如何使用Android中的OpenGL ES媒体效果
- Android深入浅出之Audio 第一部分 AudioTrack分析
- Android Studio 配置 AndroidAnnotations
- ViewPager切换滑动速度修改
- Android深入浅出之Audio 第二部分 AudioFlinger分析
- jni获取android端字符串转码为utf-8
- 终结者:电脑显示Android手机屏幕之asm.jar工具正确的使用方法
- android中的styleable的资源不能解析
- Android Audio System 之二:AudioFlinger
- Android 混淆代码总结
- Android系统中基于Binder的IPC流程框架分析
- Android Audio System 之一:AudioTrack如何与AudioFlinger交换音频数据
- android:inputType参数类型说明
- Android studio 安装中遇到一些问题的解决办法,分享一下
- Android 新浪微博客户端
- Android音频系统之AudioPolicyService
- androidの设置字体样式引起应用程序运行时占用内存过大
- Android 常用 adb 命令总结(相当全)
- Android系统辅助功能中的放大手势机制介绍(Magnification Gesture Mechanism)
- ZrcListView:一个流畅又漂亮的Android下拉刷新与加载更多列表组件