Matrix在android的API中,对该工具类的说明很简单:是拥有3*3的坐标变换矩阵。
对于数学的原理说明的话,这里就不说了,有兴趣的童鞋可以参考下下面这篇文章。
Matrix的数学原理
Matrix本身不提供对图片或者组件进行变换的,你可以把它看作为一个对图片或者组件做某种变换的系数。它的特效方法有4种,分别为:平移,旋转,缩放和倾斜变换。
1.当然它是不提供渐变的效果的,也没有变速器之类的东西,它是作为一个辅助工具类来使用的,比如在Bitmap.createBitmap
()中,添加对图像的特效,这也是最为常用的使用方式,及自定义组件的时候画布上绘制图片的时候调用 canvas.drawBitmap()中。
2.每种变换都有3中操作方式,分为:pre ,post和set。
set是只能设置一个变换,每次设置会将前面的set替掉。如:
matrix.setRotate(90);
matrix.setRotate(80);
图片表现的只是80度的旋转,而不是从90度然后旋转到80度。
post:后乘。相对set来讲,它可以添加多个变换,顺序执行。
pre:前乘。操作会在矩阵的前面执行,比如:
matrix.setRotate(20);
matrix.preTranslate(20, 100);
一般常使用的方式:
1.直接添加对bitmap的变换,然后交给图像。
Bitmap bitmap;
ImageView img;
Matrix matrix = new Matrix();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.acy_matrix);
img = (ImageView) findViewById(R.id.imageView_matrix);
matrixVary(90);
bitmap = picParams();
img.setImageBitmap(bitmap);
}
/**
* 变换效果
*/
public void matrixVary(float degrees) {
matrix.setScale(20, 20);
}
/**
* 控制位置和大小
*/
public Bitmap picParams() {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.ic_launcher);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
bitmap.getHeight(), matrix, true);
return bitmap;
}
2.自定义View绘制图像:
public class TestMatrix extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.acy_matrix);
MyImg myImg = new MyImg(this);
addContentView(myImg, new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
}
class MyImg extends View {
Bitmap bit;
Matrix matrix = new Matrix();;
public MyImg(Context context) {
super(context);
// TODO Auto-generated constructor stub
bit = BitmapFactory.decodeResource(getResources(),
R.drawable.ic_launcher);
matrix.postRotate(20);
matrix.postTranslate(20, 100);
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
canvas.drawBitmap(bit, matrix, null);
}
}
}
注意:
1.Matrix这个工具类,相同的名字对应着两个不同的工具。一个是3*3的二维图形变换,导入的包是android.graphics.Matrix,一个是4*4的的三维图形变换,导入的包是android.opengl.Matrix。虽然特效都差不多,但三维的方法后面几乎都会带大写的“M”,参数列表也不同,三维的多了对于z的操作,还是很好区别是否导错包的。