1. 程式人生 > >我的Android進階之旅------>android Matrix圖片隨意的放大縮小,拖動

我的Android進階之旅------>android Matrix圖片隨意的放大縮小,拖動

step1:新建一個專案DragAndZoom,並準備一張照片放在res/drawable-hdpi目錄下,如下圖所示:

       

step2: 設定應用的UI介面,在main.xml中設定:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:orientation="vertical"
  4.     android:layout_width="fill_parent"
  5.     android:layout_height="fill_parent"
  6.     >
  7. <ImageView
  8.     android:layout_width="fill_parent"
  9.     android:layout_height="wrap_content"
  10.     android:src="@drawable/wall"
  11.     android:id="@+id/imageView"
  12.     android:scaleType="matrix"
  13.     /><!-- 指定為matrix型別 -->
  14. </LinearLayout>

step3:MainActivity.java中實現具體的需求
  1. package cn.roco.drag;  
  2. import android.app.Activity;  
  3. import android.graphics.Matrix;  
  4. import android.graphics.PointF;  
  5. import android.os.Bundle;  
  6. import android.util.FloatMath;  
  7. import android.view.MotionEvent;  
  8. import android.view.View;  
  9. import android.view.View.OnTouchListener;  
  10. import android.widget.ImageView;  
  11. publicclass MainActivity extends Activity {  
  12.     private ImageView imageView;  
  13.     @Override
  14.     publicvoid onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.main);  
  17.         imageView = (ImageView) this.findViewById(R.id.imageView);  
  18.         imageView.setOnTouchListener(new TouchListener());  
  19.     }  
  20.     privatefinalclass TouchListener implements OnTouchListener {  
  21.         /** 記錄是拖拉照片模式還是放大縮小照片模式 */
  22.         privateint mode = 0;// 初始狀態  
  23.         /** 拖拉照片模式 */
  24.         privatestaticfinalint MODE_DRAG = 1;  
  25.         /** 放大縮小照片模式 */
  26.         privatestaticfinalint MODE_ZOOM = 2;  
  27.         /** 用於記錄開始時候的座標位置 */
  28.         private PointF startPoint = new PointF();  
  29.         /** 用於記錄拖拉圖片移動的座標位置 */
  30.         private Matrix matrix = new Matrix();  
  31.         /** 用於記錄圖片要進行拖拉時候的座標位置 */
  32.         private Matrix currentMatrix = new Matrix();  
  33.         /** 兩個手指的開始距離 */
  34.         privatefloat startDis;  
  35.         /** 兩個手指的中間點 */
  36.         private PointF midPoint;  
  37.         @Override
  38.         publicboolean onTouch(View v, MotionEvent event) {  
  39.             /** 通過與運算保留最後八位 MotionEvent.ACTION_MASK = 255 */
  40.             switch (event.getAction() & MotionEvent.ACTION_MASK) {  
  41.             // 手指壓下螢幕
  42.             case MotionEvent.ACTION_DOWN:  
  43.                 mode = MODE_DRAG;  
  44.                 // 記錄ImageView當前的移動位置
  45.                 currentMatrix.set(imageView.getImageMatrix());  
  46.                 startPoint.set(event.getX(), event.getY());  
  47.                 break;  
  48.             // 手指在螢幕上移動,改事件會被不斷觸發
  49.             case MotionEvent.ACTION_MOVE:  
  50.                 // 拖拉圖片
  51.                 if (mode == MODE_DRAG) {  
  52.                     float dx = event.getX() - startPoint.x; // 得到x軸的移動距離
  53.                     float dy = event.getY() - startPoint.y; // 得到x軸的移動距離
  54.                     // 在沒有移動之前的位置上進行移動
  55.                     matrix.set(currentMatrix);  
  56.                     matrix.postTranslate(dx, dy);  
  57.                 }  
  58.                 // 放大縮小圖片
  59.                 elseif (mode == MODE_ZOOM) {  
  60.                     float endDis = distance(event);// 結束距離
  61.                     if (endDis > 10f) { // 兩個手指併攏在一起的時候畫素大於10
  62.                         float scale = endDis / startDis;// 得到縮放倍數
  63.                         matrix.set(currentMatrix);  
  64.                         matrix.postScale(scale, scale,midPoint.x,midPoint.y);  
  65.                     }  
  66.                 }  
  67.                 break;  
  68.             // 手指離開螢幕
  69.             case MotionEvent.ACTION_UP:  
  70.                 // 當觸點離開螢幕,但是螢幕上還有觸點(手指)
  71.             case MotionEvent.ACTION_POINTER_UP:  
  72.                 mode = 0;  
  73.                 break;  
  74.             // 當螢幕上已經有觸點(手指),再有一個觸點壓下螢幕
  75.             case MotionEvent.ACTION_POINTER_DOWN:  
  76.                 mode = MODE_ZOOM;  
  77.                 /** 計算兩個手指間的距離 */
  78.                 startDis = distance(event);  
  79.