要解决Android缩放图像视图(ImageView)与ViewPager冲突的滑动手势问题,可以通过自定义一个可缩放的ImageView,然后在ViewPager中使用这个自定义的ImageView来代替原生的ImageView。
以下是一个示例代码,展示了如何实现这个自定义的可缩放的ImageView:
import android.content.Context;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.support.v7.widget.AppCompatImageView;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
public class ZoomableImageView extends AppCompatImageView {
private Matrix matrix;
private float[] matrixValues;
private PointF startPoint;
private float startDistance;
private float startScale;
private float maxScale;
private ScaleGestureDetector scaleGestureDetector;
private GestureDetector gestureDetector;
public ZoomableImageView(Context context) {
super(context);
init();
}
public ZoomableImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ZoomableImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
matrix = new Matrix();
matrixValues = new float[9];
startPoint = new PointF();
scaleGestureDetector = new ScaleGestureDetector(getContext(), new ScaleGestureListener());
gestureDetector = new GestureDetector(getContext(), new DoubleTapGestureListener());
setScaleType(ScaleType.MATRIX);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
scaleGestureDetector.onTouchEvent(event);
gestureDetector.onTouchEvent(event);
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
startPoint.set(event.getX(), event.getY());
break;
case MotionEvent.ACTION_MOVE:
if (event.getPointerCount() == 1) {
float dx = event.getX() - startPoint.x;
float dy = event.getY() - startPoint.y;
startPoint.set(event.getX(), event.getY());
matrix.postTranslate(dx, dy);
setImageMatrix(matrix);
}
break;
}
return true;
}
private class ScaleGestureListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
float scaleFactor = detector.getScaleFactor();
float focusX = detector.getFocusX();
float focusY = detector.getFocusY();
matrix.getValues(matrixValues);
float currentScale = matrixValues[Matrix.MSCALE_X];
float newScale = currentScale * scaleFactor;
if (newScale < startScale) {
newScale = startScale;
} else if (newScale > maxScale) {
newScale = maxScale;
}
float scaleRatio = newScale / currentScale;
matrix.postScale(scaleRatio, scaleRatio, focusX, focusY);
setImageMatrix(matrix);
return true;
}
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
matrix.getValues(matrixValues);
startScale = matrixValues[Matrix.MSCALE_X];
maxScale = startScale * 3; // 设置最大缩放比例为初始缩放比例的3倍
return true;
}
}
private class DoubleTapGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDoubleTap(MotionEvent e) {
matrix.getValues(matrixValues);
float currentScale = matrixValues[Matrix.MSCALE_X];
float targetScale;
if (currentScale < maxScale) {
targetScale = maxScale;
} else {
targetScale = startScale;
}
float scaleRatio = targetScale / currentScale;
matrix.postScale(scaleRatio, scaleRatio, e.getX(), e.getY());
setImageMatrix(matrix);
return true;
}
}
}
在ViewPager布局中使用这个自定义的ImageView:
这样就可以在ViewPager中实现缩放图像的功能,并避免与ViewPager的滑动手势冲突。