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()产生的矩阵分别是怎样的:
package
com.itheima28.copybitmap;
import android.app.Activity;
import android.graphics.Matrix;
import android.os.Bundle;
import android.util.Log;
public class MainActivity
extends
Activity {
@Override
protected void
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Matrix matrix=new
Matrix();
// 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 void
printMatrix(Matrix matrix){
float[] values=new
float[9];
matrix.getValues(values);
for(int
i=0;
i<3;
i++){
StringBuffer buffer=new
StringBuffer();
for(int
j=0;
j<3;
j++){
buffer.append(values[i*3+j]+"
");
}
Log.e("ShadowfaxGHH",
buffer.toString());
}
}
}