简单介绍Matrix的图形特效

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);
		}
	}
}

结果:

简单介绍Matrix的图形特效_第1张图片



注意:

1.Matrix这个工具类,相同的名字对应着两个不同的工具。一个是3*3的二维图形变换,导入的包是android.graphics.Matrix,一个是4*4的的三维图形变换,导入的包是android.opengl.Matrix。虽然特效都差不多,但三维的方法后面几乎都会带大写的“M”,参数列表也不同,三维的多了对于z的操作,还是很好区别是否导错包的。

你可能感兴趣的:(图形,Matrix)