简单介绍Matrix的图形特效

来源:互联网 发布:净网行动知乎 编辑:程序博客网 时间:2024/06/09 17:48

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();@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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 stubbit = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);matrix.postRotate(20);matrix.postTranslate(20, 100);}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);canvas.drawBitmap(bit, matrix, null);}}}

结果:




注意:

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

0 0
原创粉丝点击