package net.dev123.yibo.widget; import net.dev123.yibo.common.Constants; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.GestureDetector; import android.view.MotionEvent; public class TouchImageView extends ImageViewTouchBase { private static final String TAG = TouchImageView.class.getSimpleName(); private GestureDetector mGestureDetector; private ScaleGestureDetector mScaleGestureDetector; private boolean mScaleGesture; private float mScaleFactor = 1.0F; public TouchImageView(Context context) { super(context); init(context); } public TouchImageView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } private void init(Context context) { mScaleGestureDetector = new ScaleGestureDetector(context, new ScaleGestureListener()); mGestureDetector = new GestureDetector(context, new GestureListener()); } @Override public void zoomIn() { super.zoomIn(); mScaleFactor = getScale(); } @Override public void zoomOut() { super.zoomOut(); mScaleFactor = getScale(); } @Override public boolean onTouchEvent(MotionEvent event) { if (Constants.DEBUG) { Log.d(TAG, "onTouchEvent……"); dumpEvent(event); } int action = event.getAction() & MotionEvent.ACTION_MASK; if (event.getPointerCount() == 2 && (action == MotionEvent.ACTION_POINTER_1_DOWN || action == MotionEvent.ACTION_POINTER_2_DOWN )) { mScaleGesture = true; } else if (event.getPointerCount() == 1 && action == MotionEvent.ACTION_DOWN) { mScaleGesture = false; } if (mScaleGesture) { mScaleGestureDetector.onTouchEvent(event); } else { mGestureDetector.onTouchEvent(event); } return true; } private void dumpEvent(MotionEvent event) { String[] names = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE", "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" }; StringBuilder sb = new StringBuilder(); int action = event.getAction(); int actionCode = action & MotionEvent.ACTION_MASK; sb.append("event ACTION.").append(names[actionCode]); if (actionCode == MotionEvent.ACTION_POINTER_DOWN || actionCode == MotionEvent.ACTION_POINTER_UP) { sb.append("(pid ").append( action >> MotionEvent.ACTION_POINTER_ID_SHIFT); sb.append(")"); } sb.append("["); for (int i = 0; i < event.getPointerCount(); i++) { sb.append("#").append(i); sb.append("(pid ").append(event.getPointerId(i)); sb.append(")=").append((int) event.getX(i)); sb.append(", ").append((int) event.getY(i)); if (i + 1 < event.getPointerCount()) { sb.append(":"); } } sb.append("]"); Log.d(TAG, sb.toString()); } private class GestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onDoubleTap(MotionEvent e) { if (mScaleFactor == 1.0F) { mScaleFactor = 3.0F; } else { mScaleFactor = 1.0F; } float posX = e.getX(); float posY = e.getY(); posX -= (getWidth() / 2); posY -= (getHeight() / 2); postTranslate(-posX, -posY); zoomTo(mScaleFactor); return true; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { postTranslate(-distanceX, -distanceY); center(true, true); return true; } @Override public boolean onSingleTapConfirmed(MotionEvent e) { performClick(); return true; } @Override public void onLongPress(MotionEvent e) { performLongClick(); } } private class ScaleGestureListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { @Override public boolean onScale(ScaleGestureDetector detector) { mScaleFactor *= detector.getScaleFactor(); // Don't let the object get too small or too large. mScaleFactor = Math.max(1.0F, Math.min(mScaleFactor, maxZoom())); if (Constants.DEBUG) { Log.d(TAG, "Zoom To : " + mScaleFactor); } zoomTo(mScaleFactor); return true; } } }