Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix

MainActivity如下:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  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 android.app.Activity;  
  7. import android.graphics.Matrix;  
  8. /** 
  9.  * Demo描述: 
  10.  * 利用mImageView.setImageMatrix(matrix)实现 
  11.  * 图片的平移,缩放,旋转,倾斜以及对称 
  12.  *  
  13.  * 参考资料: 
  14.  * 0 http://blog.csdn.net/pathuang68/article/details/6991988 
  15.  * 1 http://blog.csdn.net/mingli198611/article/details/7830633 
  16.  *  
  17.  * Thank you very much 
  18.  */  
  19. public class MainActivity extends Activity {  
  20.     private TestMatrixImageView mTestMatrixImageView;  
  21.     @Override  
  22.     protected void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         mTestMatrixImageView=new TestMatrixImageView(MainActivity.this);  
  25.         mTestMatrixImageView.setScaleType(ImageView.ScaleType.MATRIX);//??  
  26.         mTestMatrixImageView.setOnTouchListener(new TouchListenerImpl());  
  27.         setContentView(mTestMatrixImageView);  
  28.     }  
  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.       
  60.     //平移  
  61.     private void testTranslate(){  
  62.         Matrix matrix=new Matrix();  
  63.         int width=mTestMatrixImageView.getBitmap().getWidth();  
  64.         int height=mTestMatrixImageView.getBitmap().getHeight();  
  65.         matrix.postTranslate(width, height);  
  66.         mTestMatrixImageView.setImageMatrix(matrix);  
  67.         showMatrixEveryValue(matrix);  
  68.     }  
  69.     //围绕图片中心点旋转  
  70.     private void testRotate(){  
  71.         Matrix matrix=new Matrix();  
  72.         int width=mTestMatrixImageView.getBitmap().getWidth();  
  73.         int height=mTestMatrixImageView.getBitmap().getHeight();  
  74.         matrix.postRotate(45f, width/2, height/2);  
  75.         matrix.postTranslate(width, height);  
  76.         mTestMatrixImageView.setImageMatrix(matrix);  
  77.         showMatrixEveryValue(matrix);  
  78.     }  
  79.       
  80.     //围绕原点旋转后平移  
  81.     //注意以下三行代码的执行顺序:  
  82.     //matrix.setRotate(45f);  
  83.     //matrix.preTranslate(-width, -height);  
  84.     //matrix.postTranslate(width, height);  
  85.     //先执行matrix.preTranslate(-width, -height);  
  86.     //后执行matrix.setRotate(45f);  
  87.     //再执行matrix.postTranslate(width, height);  
  88.     private void testRotateAndTranslate() {  
  89.         Matrix matrix = new Matrix();  
  90.         int width = mTestMatrixImageView.getBitmap().getWidth();  
  91.         int height = mTestMatrixImageView.getBitmap().getHeight();  
  92.         matrix.setRotate(45f);  
  93.         matrix.preTranslate(-width, -height);  
  94.         matrix.postTranslate(width, height);  
  95.         mTestMatrixImageView.setImageMatrix(matrix);  
  96.         showMatrixEveryValue(matrix);  
  97.     }  
  98.       
  99.     //缩放  
  100.     private void testScale() {  
  101.         Matrix matrix = new Matrix();  
  102.         matrix.setScale(0.5f, 0.5f);  
  103.         mTestMatrixImageView.setImageMatrix(matrix);  
  104.         showMatrixEveryValue(matrix);  
  105.     }  
  106.       
  107.     //水平倾斜  
  108.     private void testSkewX() {  
  109.         Matrix matrix = new Matrix();  
  110.         matrix.setSkew(0.5f, 0);  
  111.         mTestMatrixImageView.setImageMatrix(matrix);  
  112.         showMatrixEveryValue(matrix);  
  113.     }  
  114.   
  115.     // 垂直倾斜  
  116.     private void testSkewY() {  
  117.         Matrix matrix = new Matrix();  
  118.         matrix.setSkew(0, 0.5f);  
  119.         mTestMatrixImageView.setImageMatrix(matrix);  
  120.         showMatrixEveryValue(matrix);  
  121.     }  
  122.       
  123.     // 水平且垂直倾斜  
  124.     private void testSkewXY() {  
  125.         Matrix matrix = new Matrix();  
  126.         matrix.setSkew(0.5f, 0.5f);  
  127.         mTestMatrixImageView.setImageMatrix(matrix);  
  128.         showMatrixEveryValue(matrix);  
  129.     }  
  130.       
  131.     // 水平对称--图片关于X轴对称  
  132.     private void testSymmetryX() {  
  133.         Matrix matrix = new Matrix();  
  134.         int height = mTestMatrixImageView.getBitmap().getHeight();  
  135.         float matrixValues[] = { 1f, 0f, 0f, 0f, -1f, 0f, 0f, 0f, 1f };  
  136.         matrix.setValues(matrixValues);  
  137.         //若是matrix.postTranslate(0, height);  
  138.         //表示将图片上下倒置  
  139.         matrix.postTranslate(0, height*2);  
  140.         mTestMatrixImageView.setImageMatrix(matrix);  
  141.         showMatrixEveryValue(matrix);  
  142.     }  
  143.       
  144.     // 垂直对称--图片关于Y轴对称  
  145.     private void testSymmetryY() {  
  146.         Matrix matrix = new Matrix();  
  147.         int width=mTestMatrixImageView.getBitmap().getWidth();  
  148.         float matrixValues[] = {-1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f};  
  149.         matrix.setValues(matrixValues);  
  150.         //若是matrix.postTranslate(width,0);  
  151.         //表示将图片左右倒置  
  152.         matrix.postTranslate(width*2, 0);  
  153.         mTestMatrixImageView.setImageMatrix(matrix);  
  154.         showMatrixEveryValue(matrix);  
  155.   
  156.     }  
  157.   
  158.     // 关于X=Y对称--图片关于X=Y轴对称  
  159.     private void testSymmetryXY() {  
  160.         Matrix matrix = new Matrix();  
  161.         int width = mTestMatrixImageView.getBitmap().getWidth();  
  162.         int height = mTestMatrixImageView.getBitmap().getHeight();  
  163.         float matrixValues[] = { 0f, -1f, 0f, -1f, 0f, 0f, 0f, 0f, 1f };  
  164.         matrix.setValues(matrixValues);  
  165.         matrix.postTranslate(width+height, width+height);  
  166.         mTestMatrixImageView.setImageMatrix(matrix);  
  167.         showMatrixEveryValue(matrix);  
  168.     }  
  169.       
  170.     //获取变换矩阵Matrix中的每个值  
  171.     private void showMatrixEveryValue(Matrix matrix){  
  172.         float matrixValues []=new float[9];  
  173.         matrix.getValues(matrixValues);  
  174.         for (int i = 0; i <3; i++) {  
  175.             String valueString="";  
  176.             for (int j = 0; j < 3; j++) {  
  177.                 valueString=matrixValues[3*i+j]+"";  
  178.                 System.out.println("第"+(i+1)+"行的第"+(j+1)+"列的值为"+valueString);  
  179.             }  
  180.         }  
  181.     }  
  182.   
  183. }  

 

TestMatrixImageView如下:

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  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] view plaincopy在CODE上查看代码片派生到我的代码片
 
    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.   
    7.     <TextView  
    8.         android:layout_width="wrap_content"  
    9.         android:layout_height="wrap_content"  
    10.         android:text="@string/hello_world" />  
    11.   
    12. </RelativeLayout>  
posted @ 2015-11-14 23:30  牧之丨  阅读(1794)  评论(0编辑  收藏  举报