1,Matrix 原理简单介绍

Matrix :矩阵,线性代数里有介绍,结合Matrix,用于平面的缩放、平移、旋转等操作。
首先介绍一下矩阵运算。加法和减法就不用说了,太简单了,对应位相加就好。图像处理,主要用到的是乘法 。下面是一个乘法的公式:



在 Android 里面, Matrix 由 9 个 float 值构成,是一个 3*3 的矩阵。如下图。


2,Android里面提供了对Matrix操作的一系列方便的接口。

Matrix的操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,每一种变换在


Android的API里都提供了set, post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点


set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉


post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。例如,要将一个图片旋
转30度,然后平移到(100,100)的地方,那么可以这样做:

Matrix m = new Matrix();  m.postRotate(30);  m.postTranslate(100, 100); 


下面给出一个例子。

[java] view plain copy
  1. packagechroya.demo.graphics;
  2. importandroid.content.Context;
  3. importandroid.graphics.Bitmap;
  4. importandroid.graphics.Canvas;
  5. importandroid.graphics.Matrix;
  6. importandroid.graphics.Rect;
  7. importandroid.graphics.drawable.BitmapDrawable;
  8. importandroid.util.DisplayMetrics;
  9. importandroid.view.MotionEvent;
  10. importandroid.view.View;
  11. publicclassMyViewextendsView{
  12. privateBitmapmBitmap;
  13. privateMatrixmMatrix=newMatrix();
  14. publicMyView(Contextcontext){
  15. super(context);
  16. initialize();
  17. }
  18. privatevoidinitialize(){
  19. Bitmapbmp=((BitmapDrawable)getResources().getDrawable(R.drawable.show)).getBitmap();
  20. mBitmap=bmp;
  21. /*首先,将缩放为100*100。这里scale的参数是比例。有一点要注意,如果直接用100/
  22. bmp.getWidth()的话,会得到0,因为是整型相除,所以必须其中有一个是float型的,直接用100f就好。*/
  23. mMatrix.setScale(100f/bmp.getWidth(),100f/bmp.getHeight());
  24. //平移到(100,100)处
  25. mMatrix.postTranslate(100,100);
  26. //倾斜x和y轴,以(100,100)为中心。
  27. mMatrix.postSkew(0.2f,0.2f,100,100);
  28. }
  29. @OverrideprotectedvoidonDraw(Canvascanvas){
  30. //super.onDraw(canvas);//如果界面上还有其他元素需要绘制,只需要将这句话写上就行了。
  31. canvas.drawBitmap(mBitmap,mMatrix,null);
  32. }
  33. }


运行效果如下:

红色的x和y表示倾斜的角度,下面是x,上面是y。



抽象的说pre方法是向前"生长", post方法是向后"生长",具体拿个例子来说,比如一个matrix调用了下列一系列的方法:


matrix.preScale(0.5f, 1); matrix.preTranslate(10, 0);matrix.postScale(0.7f, 1); matrix.postTranslate(15, 0); 则坐标变换经过的4个变换过程依次是:


translate(10, 0) -> scale(0.5f, 1) -> scale(0.7f, 1) -> translate(15, 0),


所以对matrix方法的调用顺序是很重要的,不同的顺序往往会产生不同的变换效果。pre方法的调用顺序和post方法的互不影响,即以下的方法调用和前者在真实坐标变换顺序里是一致的,


matrix.postScale(0.7f, 1);matrix.preScale(0.5f, 1); matrix.preTranslate(10, 0);matrix.postTranslate(15, 0);

而matrix的set方法则会对先前的pre和post操作进行刷除,而后再设置它的值,比如下列的方法调用:


matrix.preScale(0.5f, 1); matrix.postTranslate(10, 0); matrix.setScale(1, 0.6f); matrix.postScale(0.7f, 1);


matrix.preTranslate(15, 0); 其坐标变换顺序是


translate(15, 0) ->scale(1, 0.6f) -> scale(0.7f, 1).


setScale重新设置了矩阵的值,之前的两个变换是无效的了,所以最终的显示效果只有三个变换效果。


demo:http://download.csdn.net/detail/guitk/8037203

更多相关文章

  1. android的wake_lock介绍
  2. Android的ANR详解(原因和方案)
  3. Android(安卓)绘制文本垂直居中
  4. Android进阶高手(四)终谈GPS
  5. Android中动态改变控件的大小的一种方法
  6. Android(安卓)基于Zxing的扫码功能实现(二)
  7. Android的消息机制Handler
  8. Android(安卓)ListView 异步加载图片并缓存到本地
  9. Android(安卓)BroastCast的使用详解

随机推荐

  1. Andorid入门学习笔记整理(一)
  2. Android(安卓)SDK4.0.3及以上版本支持int
  3. 在开发过程中使用Android返回键
  4. 解决某些手机RadioGroup中的RadioButton
  5. Android使用am命令实现拨打电话、打开应
  6. Android硬件抽象层(HAL)深入剖析(三)
  7. android中的配置权限
  8. 献给android原生应用层开发初学者技术架
  9. android XML文件解析之 SAX解析方法
  10. Android进程间通信纪要