package com.xiaomi.xms.sales.widget.gallery; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import com.xiaomi.xms.sales.util.LogUtil; import com.xiaomi.xms.sales.widget.gallery.ScaleGestureDetector.OnScaleGestureListener; public class ZoomImageView extends ImageViewTouchBase { private static final String TAG = "ZoomImageView"; private boolean mOnScale; private ScaleGestureDetector mScaleGestureDetector; private GestureDetector mGestureDetector; public interface OnImageTapListener { public void onImageTap(); } private OnImageTapListener mImageTapListener; public void setOnTapListener(OnImageTapListener l) { mImageTapListener = l; } public ZoomImageView(Context context, AttributeSet attrs) { super(context, attrs); mScaleGestureDetector = new ScaleGestureDetector(getContext(), new MyGestureScaleListener()); mGestureDetector = new GestureDetector(getContext(), new MyGestureListener(), null, true); } public boolean isZoomedOut() { return (getScale() - 1F) > 0.1; } @Override public boolean onTouchEvent(MotionEvent event) { LogUtil.d(TAG, "The action is:" + event.getAction()); if (!mOnScale) { mGestureDetector.onTouchEvent(event); } try { mScaleGestureDetector.onTouchEvent(event); } catch (Exception e) { } return true; } private class MyGestureScaleListener implements OnScaleGestureListener { private float mCurrentScale; private float mCurrentMiddleX; private float mCurrentMiddleY; @Override public boolean onScale(ScaleGestureDetector detector, float mx, float my) { LogUtil.d(TAG, "gesture onScale"); float ns = getScale() * detector.getScaleFactor(); mCurrentScale = ns; mCurrentMiddleX = mx; mCurrentMiddleY = my; if (detector.isInProgress()) { zoomToNoCenter(ns, mx, my); } return true; } @Override public boolean onScaleBegin(ScaleGestureDetector detector) { LogUtil.d(TAG, "gesture onScaleStart"); mOnScale = true; return true; } @Override public void onScaleEnd(ScaleGestureDetector detector) { if (mCurrentScale > mMaxZoom) { zoomToNoCenterWithAni(mCurrentScale / mMaxZoom, 1, mCurrentMiddleX, mCurrentScale); mCurrentScale = mMaxZoom; zoomToNoCenterValue(mCurrentScale, mCurrentMiddleX, mCurrentMiddleY); } else if (mCurrentScale < mMinZoom) { zoomToNoCenterWithAni(mCurrentScale, mMinZoom, mCurrentMiddleX, mCurrentMiddleY); mCurrentScale = mMinZoom; zoomToNoCenterValue(mCurrentScale, mCurrentMiddleX, mCurrentMiddleY); } else { zoomToNoCenter(mCurrentScale, mCurrentMiddleX, mCurrentMiddleY); } mOnScale = false; } } private class MyGestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { LogUtil.d(TAG, "gesture onScroll"); if (mOnScale) { return true; } panBy(-distanceX, -distanceY); center(true, true); return true; } @Override public boolean onUp(MotionEvent e) { return super.onUp(e); } @Override public boolean onSingleTapConfirmed(MotionEvent e) { if (mImageTapListener != null) { mImageTapListener.onImageTap(); } return true; } @Override public boolean onDoubleTap(MotionEvent e) { // Switch between the original scale and 3x scale. if (mBaseZoom < 1) { if (getScale() > 2F) { zoomTo(1f); } else { zoomToPoint(3f, e.getX(), e.getY()); } } else { if (getScale() > (mMinZoom + mMaxZoom) / 2f) { zoomTo(mMinZoom); } else { zoomToPoint(mMaxZoom, e.getX(), e.getY()); } } return true; } } }