Matrix

来源:互联网 发布:伪娘交友软件 编辑:程序博客网 时间:2024/06/06 05:58

 

Matrix的本质是一个3x3的矩阵,初始状态是


调用set()设置矩阵,调用pre()叠加前置矩阵,调用post()叠加后置矩阵。

需要注意的是,对于叠加矩阵,比如说[pre][set][post],并不是对元素进行了3次变换,而是先计算出最终矩阵,然后只进行1次变换。

举例来说:

matrix.setTranslate(100,100);
matrix.postScale(0.5f,0.5f);

并不是先将元素移动到(100, 100),然后再对元素缩放(0.5, 0.5,而是缩放0.5再只移动(50 50


 

对一个元素运用Matrix,本质相当于是对这个元素中的每个点进行矩阵变换,其中(x0,y0)是变换前的点,(x,y)是变换后的点。


 

如下程序演示一下,Matrix的四个方法translate()rotate()scale()skew()产生的矩阵分别是怎样的:

packagecom.itheima28.copybitmap;

import
android.app.Activity;
import
android.graphics.Matrix;
import
android.os.Bundle;
import
android.util.Log;

public class
MainActivityextendsActivity {

   
@Override
   
protected voidonCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
       
setContentView(R.layout.activity_main);

       
Matrix matrix=newMatrix();
//       printMatrix(matrix);

//       matrix.setValues(new float[]{
//               0.5f, 0, 0,
//               0, 1, 0,
//               0, 0, 1
//       });


//       matrix.reset();
//       matrix.setTranslate(100, 100);

//       matrix.reset();
//       matrix.setRotate(90, 100, 100);

//       matrix.reset();
//       matrix.setScale(0.5f, 0.5f);

//       matrix.reset();
//       matrix.setSkew(2, 4);

       
matrix.reset();
       
//写两次post会一个接到另一个后面//估计两次pre是一个接到另一个前面
       
matrix.postTranslate(100,200);
       
matrix.postTranslate(500,600);

       
printMatrix(matrix);
   
}

   
public voidprintMatrix(Matrix matrix){
       
float[] values=new float[9];
       
matrix.getValues(values);

       for
(inti=0;i<3;i++){
           StringBuffer buffer=
newStringBuffer();
           for
(intj=0;j<3;j++){
               buffer.append(values[i*
3+j]+" ");
           
}
           Log.e(
"ShadowfaxGHH",buffer.toString());
       
}
    }
}

 


 

0 0
原创粉丝点击