您的位置:首页 > 其它

ImageView根据手势进行缩放,拖动

2014-11-17 16:44 344 查看

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);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: