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的操作,还是很好区别是否导错包的。