ImageView依据手势进行缩放,拖动
package com.example.scale;
import android.content.Context;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.util.FloatMath;
import android.view.MotionEvent;
import android.widget.ImageView;
/**
* @author wuxif_000 ImageView依据手势进行缩放,拖动........
*
*/
public class TouchImageView extends ImageView {
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();
static final int NONE = 0;
/**
* 对imageView进行上、下、左、右拖动..........
*/
static final int DRAG = 1;
/**
* 对imageView进行缩放...........
*/
static final int ZOOM = 2;
int mode = NONE;
/**
* MotionEvent.ACTION_DOWN的坐标
*/
PointF start = new PointF();
/**
* 第一次感觉到两点的时候,获取两点间的中点坐标,以此点进行缩放,假设是多点触控的话........
*/
PointF mid = new PointF();
/**
* 第一次感觉到两点的时候。两点间的距离
*/
float oldDistance = 1f;
/**
* 对图片进行缩放的最大比例
*/
private final int maxScale=5;
public TouchImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
//第一个手指down的时候
matrix.set(getImageMatrix());
savedMatrix.set(matrix);
start.set(event.getX(), event.getY());
mode = DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN:
//第二个手指down时。两点间的距离.......
oldDistance=spacing(event);
if (oldDistance > 10f) {
matrix.set(savedMatrix);
//保存两点间的中点........
midPoint(mid, event);
//对图片进行缩放
mode = ZOOM;
}
break;
case MotionEvent.ACTION_MOVE:
if(mode==DRAG){
matrix.set(savedMatrix);
//一个手指进行上、下、左、右拖动...........
//x,y移动的距离计算...........
matrix.postTranslate(event.getX() - start.x, event.getY()
- start.y);
}else if(mode==ZOOM){
//对imageView进行缩放........
//两点之间的距离
float newDistance = spacing(event);
//假设两点间的距离>10就进行缩放..........
if (newDistance > 10f) {
matrix.set(savedMatrix);
//缩放最大为5
float f = newDistance / oldDistance;
float scale = f>maxScale?maxScale:f;
//在最初两点间的中点,以该点进行缩放........
matrix.postScale(scale, scale, mid.x, mid.y);
}
}
break;
case MotionEvent.ACTION_UP:
mode=NONE;
//点击事件处理,旋转180度............
if (Math.abs(event.getX()-start.x) < 10 & Math.abs(event.getY()-start.y) < 10) {
matrix.set(savedMatrix);
matrix.postRotate(180, getWidth()/2, getHeight()/2);
}
break;
case MotionEvent.ACTION_POINTER_UP:
mode=NONE;
break;
default:
break;
}
setScaleType(ImageView.ScaleType.MATRIX);
setImageMatrix(matrix);
//return super.onTouchEvent(event);
//要设为true,不然setImageMatrix(matrix)不起作用
//要设为true,不然setImageMatrix(matrix)不起作用
//要设为true,不然setImageMatrix(matrix)不起作用
return true;
}
/**
* 两点的距离 Determine the space between the first two fingers
*/
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);
}
/**
* 两点的中点 Calculate the mid point of the first two fingers
* */
private void midPoint(PointF point, MotionEvent event) {
//1,2的中点是(1+2) /2=1.5
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x / 2, y / 2);
}
}