Android Open Source - UniversalImagePick Mulit Point Touch Listener






From Project

Back to project page UniversalImagePick.

License

The source code is released under:

Apache License

If you think the Android project UniversalImagePick listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.luffyjet.universalimagepick.widget;
//from w  ww . j  av  a  2s .  c o  m
import com.luffyjet.universalimagepick.utils.LogUtil;

import android.R.integer;
import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.graphics.drawable.BitmapDrawable;
import android.util.FloatMath;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;

public class MulitPointTouchListener implements OnTouchListener {

  private static final String TAG = "MulitPointTouchListener";
  Matrix matrix = new Matrix();
  Matrix savedMatrix = new Matrix();

  private ImageView imageview;
  static final int NONE = 0;
  static final int DRAG = 1;
  static final int ZOOM = 2;
  int mode = NONE;

  private int screenWidth;
  private int screenHeight;

  private static final float DEFAULT_MAX_SCALE = 3.0f;
  private static final float DEFAULT_MID_SCALE = 1.75f;
  private static final float DEFAULT_MIN_SCALE = 1.0f;

  private long lastClickTime;
  private static final long DOUBLE_CLICK_TIME_SPACE = 300;// ??????????????????

  PointF start = new PointF();
  PointF mid = new PointF();
  float oldDist = 1f;
  private float offset = 100f;
  private float mScale;

  public MulitPointTouchListener(ImageView imageview, int screenWidth, int screenHeight) {
    super();
    this.imageview = imageview;
    this.screenWidth = screenWidth;
    this.screenHeight = screenHeight;

    LogUtil.i(TAG, "???" + screenWidth + "/" + screenHeight);
  }

  @Override
  public boolean onTouch(View v, MotionEvent event) {
    this.imageview.setScaleType(ScaleType.MATRIX);

    ImageView view = (ImageView) v;
    // dumpEvent(event);

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

    case MotionEvent.ACTION_DOWN:

      Log.w(TAG, "ACTION_DOWN");
      matrix.set(view.getImageMatrix());
      savedMatrix.set(matrix);
      start.set(event.getX(), event.getY());
      if (event.getPointerCount() == 1) {
        // ???????????????????????????
        if (event.getEventTime() - lastClickTime < DOUBLE_CLICK_TIME_SPACE) {

          Log.v(TAG, "DOUBLE_CLICK");

          onDoubleClick(view, event);

        } else {
          mode = DRAG;
        }
      }

      lastClickTime = event.getEventTime();
      break;
    case MotionEvent.ACTION_POINTER_DOWN:
      Log.w(TAG, "ACTION_POINTER_DOWN");
      oldDist = spacing(event);
      if (oldDist > 10f) {
        savedMatrix.set(matrix);
        midPoint(mid, event);
        mode = ZOOM;
      }
      break;
    case MotionEvent.ACTION_UP:
      Log.w(TAG, "ACTION_UP");
    case MotionEvent.ACTION_POINTER_UP:
      Log.w(TAG, "ACTION_POINTER_UP");
      mode = NONE;
      break;
    case MotionEvent.ACTION_MOVE:
      Log.w(TAG, "ACTION_MOVE?" + event.getX() + "/" + event.getY());
      if (mode == DRAG) {
        if (event.getX() >= offset && event.getX() < screenWidth - offset && event.getY() >= offset && event.getY() < screenHeight - offset) {
          matrix.set(savedMatrix);
          matrix.postTranslate(event.getX() - start.x, event.getY() - start.y);
        }
      } else if (mode == ZOOM) {
        float newDist = spacing(event);
        if (newDist > 10f) {
          matrix.set(savedMatrix);
          mScale = newDist / oldDist;
          matrix.postScale(mScale, mScale, mid.x, mid.y);
          LogUtil.showLog(TAG, "mScale: " + mScale);
        }
      }
      view.setImageMatrix(matrix);
      break;
    }

    return true;
  }

  float temp;

  private void onDoubleClick(ImageView v, MotionEvent event) {
    if (temp > 1) {
      temp = 1f / temp;
      LogUtil.d(TAG, "????????:" + temp);
    } else {
      temp = 1.5f;
      LogUtil.d(TAG, "????:" + temp);
    }
    matrix.postScale(temp, temp);
    v.setImageMatrix(matrix);
  }

  @SuppressLint("FloatMath")
  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);
  }

  /**
   * 
   * @param srcBitmap
   * @param x
   * @param y
   * @param width
   * @param height
   * @return
   */
  public Bitmap cropBitmap(int x, int y, int width, int height) {
    Bitmap result = null;
    
    imageview.setDrawingCacheEnabled(true);
    Bitmap srcBitmap = imageview.getDrawingCache();
    imageview.setDrawingCacheEnabled(false);
    try {
      result = Bitmap.createBitmap(srcBitmap, x, y, width, height);
    } catch (Exception e) {
      e.printStackTrace();
    }
    srcBitmap.recycle();
    return result;
  }
}




Java Source Code List

com.luffyjet.universalimagepick.App.java
com.luffyjet.universalimagepick.Constants.java
com.luffyjet.universalimagepick.MainActivity.java
com.luffyjet.universalimagepick.Test.java
com.luffyjet.universalimagepick.adapter.BucketAdapter.java
com.luffyjet.universalimagepick.adapter.GalleryAdapter.java
com.luffyjet.universalimagepick.adapter.PickGridAdapter.java
com.luffyjet.universalimagepick.adapter.PreviewAdapter.java
com.luffyjet.universalimagepick.adapter.ResultAdapter.java
com.luffyjet.universalimagepick.model.ImageBucket.java
com.luffyjet.universalimagepick.model.Image.java
com.luffyjet.universalimagepick.model.ImagesHelper.java
com.luffyjet.universalimagepick.model.Thumbnail.java
com.luffyjet.universalimagepick.ui.BaseActivity.java
com.luffyjet.universalimagepick.ui.GalleryActivity.java
com.luffyjet.universalimagepick.ui.PickActivity.java
com.luffyjet.universalimagepick.utils.LogUtil.java
com.luffyjet.universalimagepick.widget.CropImageView.java
com.luffyjet.universalimagepick.widget.CustomGridView.java
com.luffyjet.universalimagepick.widget.MulitPointTouchListener.java
com.luffyjet.universalimagepick.widget.ViewfinderView.java