package com.marshalchen.common.uimodule.multi_image_selector.view;
import android.content.Context;
import android.graphics.Matrix;
import android.support.v4.view.GestureDetectorCompat;
import android.support.v4.view.MotionEventCompat;
import android.support.v4.view.ScaleGestureDetectorCompat;
import android.util.AttributeSet;
import android.util.Log;
import android.view.DragEvent;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.ViewConfiguration;
import android.widget.ImageView;
import android.widget.Toast;
/**
* 支持手势的ImageView
* Created by Nereo on 2015/4/10.
*/
public class GestureImageView extends ImageView{
private static final String TAG = "GestureImageView";
public GestureImageView(Context context) {
super(context);
init(context);
}
public GestureImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public GestureImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private ScaleGestureDetector mScaleGesture;
private Matrix mImageMatrix;
private GestureDetectorCompat mGestureDetector;
// 最大缩放比例
private static final float MAX_SCALE_FACTOR = 3.0f;
// 最小缩放比例
private static final float MIN_SCALE_FACTOR = 0.3f;
// 系统常量,系统认为手指是否移动的最小距离
private int mTouchSlop;
private float mCurrentFactor = 1.0f;
private float mFirstPointerX, mFirstPointerY;
private float mSecondPointerX, mSecondPointerY;
private int mCenterX, mCenterY;
/**
* 初始化
* @param context
*/
private void init(final Context context){
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
setScaleType(ScaleType.MATRIX);
mImageMatrix = new Matrix();
mScaleGesture = new ScaleGestureDetector(context, new ScaleGestureDetector.SimpleOnScaleGestureListener(){
@Override
public boolean onScale(ScaleGestureDetector detector) {
float factor = detector.getScaleFactor();
mImageMatrix.postScale(factor, factor, mCenterX, mCenterY);
setImageMatrix(mImageMatrix);
return true;
}
});
mGestureDetector = new GestureDetectorCompat(context, new GestureDetector.SimpleOnGestureListener(){
@Override
public boolean onDoubleTap(MotionEvent e) {
mImageMatrix.postScale(1.f, 1.f, mCenterX, mCenterY);
setImageMatrix(mImageMatrix);
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
//mImageMatrix.setTranslate(0, 0);
//setImageMatrix(mImageMatrix);
return true;
}
@Override
public boolean onDown(MotionEvent e) {
return true;
}
});
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if( w != oldw || h != oldh){
int cx = (w - getDrawable().getIntrinsicWidth()) / 2 ;
int cy = (h - getDrawable().getIntrinsicHeight()) / 2;
mImageMatrix.setTranslate(cx, cy);
setImageMatrix(mImageMatrix);
mCenterX = w / 2;
mCenterY = h / 2;
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean retValue = mScaleGesture.onTouchEvent(event);
retValue = mGestureDetector.onTouchEvent(event) || retValue;
return retValue || super.onTouchEvent(event);
}
}