Matrix详解_Matrix怎么用

转载出处:http://blog.csdn.net/jason0539/article/details/9624819


在刚才的ViewPager练习中,用到了matrix,在这里再整理一下它的具体用法:

Android中,对图片的处理需要使用到Matrix类,Matrix是一个3 x 3的矩阵,他对图片的处理分为四个基本类型:

1、Translate————平移变换

2、Scale     ————缩放变换

3、Rotate    ————旋转变换

4、Skew     ————错切变换

在Android的API里对于每一种变换都提供了三种操作方式:set(用于设置Matrix中的值)、post(后乘,根据矩阵的原理,相当于左乘)、pre(先乘,相当于矩阵中的右乘)。默认时,这四种变换都是围绕(0,0)点变换的,当然可以自定义围绕的中心点,通常围绕中心点。

 

首先说说平移,在对图片处理的过程中,最常用的就是对图片进行平移操作,该方法为setTranslate(),平移意味着在x轴和y轴上简单地移动图像。setTranslate方法采用两个浮点数作为参数,表示在每个轴上移动的数量。第一个参数是图像将在x轴上移动的数量,而第二个参数是图像将在y轴上移动的数量。在x轴上使用正数进行平移将向右移动图像,而使用负数将向左移动图像。在y轴上使用正数进行平移将向下移动图像,而使用负数将向上移动图像。

 

再看缩放,Matrix类中另一个有用的方法是setScale方法。它采用两个浮点数作为参数,分别表示在每个轴上所产生的缩放量。第一个参数是x轴的缩放比例,而第二个参数是y轴的缩放比例。如:matrix.setScale(1.5f,1);


比较复杂的就是图片的旋转了,内置的方法之一是setRotate方法。它采用一个浮点数表示旋转的角度。围绕默认点(0,0),正数将顺时针旋转图像,而负数将逆时针旋转图像,其中默认点是图像的左上角,如:

[java]  view plain  copy
 print ?
  1. Matrix matrix = new Matrix();  
  2. matrix.setRotate(15);  

另外,也可以使用旋转的角度及围绕的旋转点作为参数调用setRotate方法。选择图像的中心点作为旋转点,如:

[java]  view plain  copy
 print ?
  1. matrix.setRotate(15,bmp.getWidth()/2,bmp.getHeight()/2);  

对于错切变换,在数学上又称为Shear mapping(可译为“剪切变换”)或者Transvection(缩并),它是一种比较特殊的线性变换。错切变换的效果就是让所有点的x坐标(或者y坐标)保持不变,而对应的y坐标(或者x坐标)则按比例发生平移,且平移的大小和该点到x轴(或y轴)的垂直距离成正比。错切变换,属于等面积变换,即一个形状在错切变换的前后,其面积是相等的。

 

对于程序中,一个特别有用的方法对是setScale和postTranslate,它们允许跨单个轴(或者两个轴)翻转图像。如果以一个负数缩放,那么会将该图像绘制到坐标系统的负值空间。由于(0,0)点位于左上角,使用x轴上的负数会导致向左绘制图像。因此我们需要使用postTranslate方法,将图像向右移动,如:

[java]  view plain  copy
 print ?
  1. matrix.setScale(-11);  
  2. matrix.postTranslate(bmp.getWidth(),0);  

可以在y轴上做同样的事情,翻转图像以使其倒置。通过将图像围绕两个轴上的中心点旋转180°,可以实现相同的效果,如

[java]  view plain  copy
 print ?
  1. matrix.setScale(1, -1);  
  2. matrix.postTranslate(0, bmp.getHeight());  

 

比如一个matrix调用了下列一系列的方法:

[java]  view plain  copy
 print ?
  1. matrix.preScale(0.5f, 1);   
  2. matrix.preTranslate(100);  
  3. matrix.postScale(0.7f, 1);   
  4. matrix.postTranslate(150);   

 则坐标变换经过的4个变换过程依次是:

translate(10, 0) -> scale(0.5f, 1) -> scale(0.7f, 1) -> translate(15, 0),

所以对matrix方法的调用顺序是很重要的,不同的顺序往往会产生不同的变换效果。pre方法的调用顺序和post方法的互不影响,即以下的方法调用和前者在真实坐标变换顺序里是一致的,

[java]  view plain  copy
 print ?
  1. matrix.postScale(0.7f, 1);   
  2.   
  3. matrix.preScale(0.5f, 1);  
  4.   
  5. matrix.preTranslate(100);   
  6.   
  7. matrix.postTranslate(150);  

  而matrix的set方法则会对先前的pre和post操作进行刷除,而后再设置它的值,比如下列的方法调用: 

[java]  view plain  copy
 print ?
  1. matrix.preScale(0.5f, 1);  
  2.   
  3. matrix.postTranslate(100);   
  4.   
  5. matrix.setScale(10.6f);   
  6.   
  7. matrix.postScale(0.7f, 1);  
  8.   
  9. matrix.preTranslate(150);   

其坐标变换顺序是

translate(15, 0) -> scale(1, 0.6f) ->  scale(0.7f, 1).

setScale重新设置了矩阵的值,之前的两个变换是无效的了,所以最终的显示效果只有三个变换效果。

 

 Canvas里scale, translate, rotate, concat方法都是pre方法,如果要进行更多的变换可以先从canvas获得matrix, 变换后再设置回canvas.


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值