Back to project page UniversalImagePick.
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.
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; } }