close

package com.xxx.xxx.xxxx;

 

import android.graphics.Bitmap;

import android.graphics.Matrix;

import android.graphics.PointF;

import android.util.FloatMath;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnTouchListener;

import android.widget.Gallery;

import android.widget.ImageView;

import android.widget.ImageView.ScaleType;

 

public class MulitPointTouchListener implements OnTouchListener {

 

     public ImageView imageview;

     Matrix matrix = new Matrix();

     Matrix savedMatrix = new Matrix();

 

     static final int NONE = 0;

     static final int DRAG = 1;

     static final int ZOOM = 2;

     int mode = NONE;

 

     PointF start = new PointF();

     PointF mid = new PointF();

     float newDist, oldDist = 1f;

 

     private int widthPixels, heightPixels;

     private Bitmap bitmap;

 

     public MulitPointTouchListener(ImageView image, int w, int h, Bitmap b) {

         super();

         this.imageview = image;

         this.widthPixels = w;

         this.heightPixels = h;

         this.bitmap = b;

     }

 

     @Override

     public boolean onTouch(View v, MotionEvent event) {

         this.imageview.setScaleType(ScaleType.MATRIX);

         ImageView view = (ImageView) v;

         // matrix.setScale(widthPixels, heightPixels);

         view.setImageBitmap(Bitmap.createScaledBitmap(bitmap, widthPixels,

                  heightPixels, true));

         switch (event.getAction() & MotionEvent.ACTION_MASK) {

         // 設置拖拉模式

         case MotionEvent.ACTION_DOWN:

              System.out.println("mode:"+mode);

              if(mode == ZOOM){

                  savedMatrix.set(matrix);

                  start.set(event.getX(), event.getY());

                   mode = DRAG;

              }

              break;

         case MotionEvent.ACTION_UP:

              break;

         // 設置多點觸摸模式

         case MotionEvent.ACTION_POINTER_DOWN:

              oldDist = spacing(event);

              if (oldDist > 10f) {

                  savedMatrix.set(matrix);

                  midPoint(mid, event);

                  mode = ZOOM;

              }

              break;

         case MotionEvent.ACTION_POINTER_UP:

              newDist = spacing(event);

              float scale1 = newDist / oldDist;

              System.out.println("scale1:"+scale1);

              if(scale1 < 1f)

                  matrix.setScale(1f, 1f);

              mode = ZOOM;

              break;

         case MotionEvent.ACTION_POINTER_2_UP:

              break;

         case MotionEvent.ACTION_POINTER_2_DOWN:

              break;

         // 若為DRAG模式,則點擊移動圖片

         case MotionEvent.ACTION_MOVE:

              if (mode == DRAG) {

                  matrix.set(savedMatrix);

                  // 設置位移

                  matrix.postTranslate(event.getX() - start.x, event.getX() - start.x);

              }

              // 若為ZOOM模式,則多點觸摸縮放

              else if (mode == ZOOM) {

                  newDist = spacing(event);

                  if (newDist > 10f) {

                       matrix.set(savedMatrix);

                       float scale = newDist / oldDist;

                       // 設置縮放比例和圖片中點位置

                       matrix.postScale(scale, scale, mid.x, mid.y);

                  }

              }

              break;

         }

         view.setImageMatrix(matrix);

         return true;

     }

 

     // 計算移動距離

     private float spacing(MotionEvent event) {

         float x = event.getX(0) - event.getX(1);

         float y = event.getY(0) - event.getY(1);

         return FloatMath.sqrt(x * x + y * y);

     }

 

     // 計算中點位置

     private void midPoint(PointF point, MotionEvent event) {

         float x = event.getX(0) + event.getX(1);

         float y = event.getY(0) + event.getY(1);

         point.set(x / 2, y / 2);

     }

}

arrow
arrow
    文章標籤
    android imageview
    全站熱搜

    鴨鴨仔 發表在 痞客邦 留言(0) 人氣()