MainActivity如下:




[java] ​​​​​​​

 


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


 

TestMatrixImageView如下:

 




[java] ​​​

 


  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.       
  39.     public Bitmap getBitmap(){  
  40.         System.out.println("---> getBitmap");  
  41.         return mBitmap;  
  42.     }  
  43.   
  44. }  


main.xml如下:




[html] ​​​​​​​

 


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