Android图片处理Matrix详细示例

MainActivity如下:

[java] view plaincopy

  1. package cn.testmatrix;
  2. import android.os.Bundle;
  3. import android.view.MotionEvent;
  4. import android.view.View;
  5. import android.view.View.OnTouchListener;
  6. import android.widget.ImageView;
  7. import android.app.Activity;
  8. import android.graphics.Matrix;
  9. /**
  10.  * Demo描述:
  11.  * Matrix类的使用
  12.  * 平移 缩放 旋转 倾斜
  13.  *
  14.  * 参考资料:
  15.  * 0 http://blog.csdn.net/pathuang68/article/details/6991988
  16.  * 1 http://blog.csdn.net/mingli198611/article/details/7830633
  17.  *
  18.  * Thank you very much
  19.  */
  20. public class MainActivity extends Activity {
  21.     private TestMatrixImageView mTestMatrixImageView;
  22.     @Override
  23.     protected void onCreate(Bundle savedInstanceState) {
  24.         super.onCreate(savedInstanceState);
  25.         mTestMatrixImageView=new TestMatrixImageView(MainActivity.this);
  26.         mTestMatrixImageView.setScaleType(ImageView.ScaleType.MATRIX);//??
  27.         mTestMatrixImageView.setOnTouchListener(new TouchListenerImpl());
  28.         setContentView(mTestMatrixImageView);
  29.     }
  30.     private class TouchListenerImpl implements OnTouchListener{
  31.         @Override
  32.         public boolean onTouch(View v, MotionEvent event) {
  33.             if (event.getAction()==MotionEvent.ACTION_UP) {
  34.                 //1 测试平移
  35.                 testTranslate();
  36.                 //2 测试围绕图片中心点旋转
  37.                 //testRotate();
  38.                 //3 测试围绕原点旋转后平移
  39.                 //testRotateAndTranslate();
  40.                 //4 缩放
  41.                 //testScale();
  42.                 //5 水平倾斜
  43.                 //testSkewX();
  44.                 //6 垂直倾斜
  45.                 //testSkewY();
  46.                 //7 水平且垂直倾斜
  47.                 //testSkewXY();
  48.                 //8 水平对称
  49.                 //testSymmetryX();
  50.                 //9 垂直对称
  51.                 //testSymmetryY();
  52.                 //10 关于X=Y对称
  53.                 //testSymmetryXY();
  54.             }
  55.             return true;
  56.         }
  57.     }
  58.     //平移
  59.     private void testTranslate(){
  60.         Matrix matrix=new Matrix();
  61.         int width=mTestMatrixImageView.getBitmap().getWidth();
  62.         int height=mTestMatrixImageView.getBitmap().getHeight();
  63.         matrix.postTranslate(width, height);
  64.         mTestMatrixImageView.setImageMatrix(matrix);
  65.         showMatrixEveryValue(matrix);
  66.     }
  67.     //围绕图片中心点旋转
  68.     private void testRotate(){
  69.         Matrix matrix=new Matrix();
  70.         int width=mTestMatrixImageView.getBitmap().getWidth();
  71.         int height=mTestMatrixImageView.getBitmap().getHeight();
  72.         matrix.postRotate(45f, width/2, height/2);
  73.         matrix.postTranslate(width, height);
  74.         mTestMatrixImageView.setImageMatrix(matrix);
  75.         showMatrixEveryValue(matrix);
  76.     }
  77.     //围绕原点旋转后平移
  78.     //注意以下三行代码的执行顺序:
  79.     //matrix.setRotate(45f);
  80.     //matrix.preTranslate(-width, -height);
  81.     //matrix.postTranslate(width, height);
  82.     //先执行matrix.preTranslate(-width, -height);
  83.     //后执行matrix.setRotate(45f);
  84.     //再执行matrix.postTranslate(width, height);
  85.     private void testRotateAndTranslate() {
  86.         Matrix matrix = new Matrix();
  87.         int width = mTestMatrixImageView.getBitmap().getWidth();
  88.         int height = mTestMatrixImageView.getBitmap().getHeight();
  89.         matrix.setRotate(45f);
  90.         matrix.preTranslate(-width, -height);
  91.         matrix.postTranslate(width, height);
  92.         mTestMatrixImageView.setImageMatrix(matrix);
  93.         showMatrixEveryValue(matrix);
  94.     }
  95.     //缩放
  96.     private void testScale() {
  97.         Matrix matrix = new Matrix();
  98.         matrix.setScale(0.5f, 0.5f);
  99.         mTestMatrixImageView.setImageMatrix(matrix);
  100.         showMatrixEveryValue(matrix);
  101.     }
  102.     //水平倾斜
  103.     private void testSkewX() {
  104.         Matrix matrix = new Matrix();
  105.         matrix.setSkew(0.5f, 0);
  106.         mTestMatrixImageView.setImageMatrix(matrix);
  107.         showMatrixEveryValue(matrix);
  108.     }
  109.     // 垂直倾斜
  110.     private void testSkewY() {
  111.         Matrix matrix = new Matrix();
  112.         matrix.setSkew(0, 0.5f);
  113.         mTestMatrixImageView.setImageMatrix(matrix);
  114.         showMatrixEveryValue(matrix);
  115.     }
  116.     // 水平且垂直倾斜
  117.     private void testSkewXY() {
  118.         Matrix matrix = new Matrix();
  119.         matrix.setSkew(0.5f, 0.5f);
  120.         mTestMatrixImageView.setImageMatrix(matrix);
  121.         showMatrixEveryValue(matrix);
  122.     }
  123.     // 水平对称–图片关于X轴对称
  124.     private void testSymmetryX() {
  125.         Matrix matrix = new Matrix();
  126.         int height = mTestMatrixImageView.getBitmap().getHeight();
  127.         float matrixValues[] = { 1f, 0f, 0f, 0f, -1f, 0f, 0f, 0f, 1f };
  128.         matrix.setValues(matrixValues);
  129.         //若是matrix.postTranslate(0, height);
  130.         //表示将图片上下倒置
  131.         matrix.postTranslate(0, height*2);
  132.         mTestMatrixImageView.setImageMatrix(matrix);
  133.         showMatrixEveryValue(matrix);
  134.     }
  135.     // 垂直对称–图片关于Y轴对称
  136.     private void testSymmetryY() {
  137.         Matrix matrix = new Matrix();
  138.         int width=mTestMatrixImageView.getBitmap().getWidth();
  139.         float matrixValues[] = {-1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f};
  140.         matrix.setValues(matrixValues);
  141.         //若是matrix.postTranslate(width,0);
  142.         //表示将图片左右倒置
  143.         matrix.postTranslate(width*2, 0);
  144.         mTestMatrixImageView.setImageMatrix(matrix);
  145.         showMatrixEveryValue(matrix);
  146.     }
  147.     // 关于X=Y对称–图片关于X=Y轴对称
  148.     private void testSymmetryXY() {
  149.         Matrix matrix = new Matrix();
  150.         int width = mTestMatrixImageView.getBitmap().getWidth();
  151.         int height = mTestMatrixImageView.getBitmap().getHeight();
  152.         float matrixValues[] = { 0f, -1f, 0f, -1f, 0f, 0f, 0f, 0f, 1f };
  153.         matrix.setValues(matrixValues);
  154.         matrix.postTranslate(width+height, width+height);
  155.         mTestMatrixImageView.setImageMatrix(matrix);
  156.         showMatrixEveryValue(matrix);
  157.     }
  158.     //获取变换矩阵Matrix中的每个值
  159.     private void showMatrixEveryValue(Matrix matrix){
  160.         float matrixValues []=new float[9];
  161.         matrix.getValues(matrixValues);
  162.         for (int i = 0; i <3; i++) {
  163.             String valueString=””;
  164.             for (int j = 0; j < 3; j++) {
  165.                 valueString=matrixValues[3*i+j]+””;
  166.                 System.out.println(“第”+(i+1)+”行的第”+(j+1)+”列的值为”+valueString);
  167.             }
  168.         }
  169.     }
  170. }

 

TestMatrixImageView如下:

[java] view plaincopy

  1. package cn.testmatrix;
  2. import android.content.Context;
  3. import android.graphics.Bitmap;
  4. import android.graphics.BitmapFactory;
  5. import android.graphics.Canvas;
  6. import android.graphics.Matrix;
  7. import android.widget.ImageView;
  8. /**
  9.  * 总结:
  10.  * 在MainActivity中执行:
  11.  * mTestMatrixImageView.setImageMatrix(matrix);
  12.  * 时此自定义View会先调用setImageMatrix(Matrix matrix)
  13.  * 然后调用onDraw(Canvas canvas)
  14.  */
  15. public class TestMatrixImageView extends ImageView{
  16.     private Matrix mMatrix;
  17.     private Bitmap mBitmap;
  18.     public TestMatrixImageView(Context context) {
  19.         super(context);
  20.         mMatrix=new Matrix();
  21.         mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.icon);
  22.     }
  23.     @Override
  24.     protected void onDraw(Canvas canvas) {
  25.         System.out.println(“—> onDraw”);
  26.         //画原图
  27.         canvas.drawBitmap(mBitmap, 0, 0, null);
  28.         //画经过Matrix变化后的图
  29.         canvas.drawBitmap(mBitmap, mMatrix, null);
  30.         super.onDraw(canvas);
  31.     }
  32.     @Override
  33.     public void setImageMatrix(Matrix matrix) {
  34.         System.out.println(“—> setImageMatrix”);
  35.         this.mMatrix.set(matrix);
  36.         super.setImageMatrix(matrix);
  37.     }
  38.     public Bitmap getBitmap(){
  39.         System.out.println(“—> getBitmap”);
  40.         return mBitmap;
  41.     }
  42. }

 

main.xml如下:

[html] view plaincopy

  1. <RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
  2.     xmlns:tools=”http://schemas.android.com/tools”
  3.     android:layout_width=”match_parent”
  4.     android:layout_height=”match_parent”
  5.     >
  6.     <TextView
  7.         android:layout_width=”wrap_content”
  8.         android:layout_height=”wrap_content”
  9.         android:text=”@string/hello_world” />
  10. </RelativeLayout>

标签