参考:http://blog.csdn.net/csh159/article/details/7876356
以下程序实现了两指放大图片与拖动图片
package com.lin;
import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
public class TestTouch extends Activity implements OnTouchListener{
private Matrix matrix = new Matrix();
private Matrix savedMatrix = new Matrix();
private static final int NONE = 0;
private static final int DRAG = 1;
private static final int ZOOM = 2;
private int mode = NONE; //图像变化模式
// 第一个按下的手指的点
private PointF startPoint = new PointF();
// 两个按下的手指的触摸点的中点
private PointF midPoint = new PointF();
// 初始的两个手指按下的触摸点的距离
private float oriDis = 1f;
protected void onCreate(Bundle savedInstanceState) {
//加载界面并添加事件监听
super.onCreate(savedInstanceState);
setContentView(R.layout.a);
ImageView i = (ImageView)findViewById(R.id.test);
i.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
ImageView vv = null;
if(v.getClass()==ImageView.class){vv = (ImageView)v;}
//打印出事件的相关信息
printEvent(event);
switch(event.getAction() & MotionEvent.ACTION_MASK){
case MotionEvent.ACTION_DOWN:
// 第一个手指按下事件 ,切换为拖动模式 ,保留初始状态
matrix.set(vv.getImageMatrix());
savedMatrix.set(matrix);
startPoint.set(event.getX(), event.getY());
mode = DRAG;
break;
case MotionEvent.ACTION_MOVE:
// 手指滑动事件
if (mode == DRAG) {
// 是一个手指拖动
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - startPoint.x, event.getY()
- startPoint.y);
} else if (mode == ZOOM) {
// 两个手指滑动
float newDist = 1f ;
if(event.getPointerCount()==2){ newDist= distance(event);};
if (newDist > 10f) { //程序不能对移动一点都要缩小放大变化
matrix.set(savedMatrix);
float scale = newDist / oriDis; //收缩比
matrix.postScale(scale, scale, midPoint.x, midPoint.y);
}
}
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_POINTER_DOWN:
//计算出第一个点与第二个点之间的初始距离,更改模式为移动
oriDis = distance(event);
if (oriDis > 10f) {
savedMatrix.set(matrix);
midPoint = middle(event);
mode = ZOOM;
}
break;
case MotionEvent.ACTION_POINTER_UP:
break;
}
vv.setImageMatrix(matrix);
return true;
}
private PointF middle(MotionEvent event) {
// TODO 返回两点之间的中点
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
return new PointF(x / 2, y / 2);
}
private float distance(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);
}
private void printEvent(MotionEvent event) {
// TODO Auto-generated method stub
System.out.println("触控对象》》》》》》》》"+event);
System.out.println("触控点》》》》》》》》》"+event.getPointerCount());
for(int i=0;i<event.getPointerCount();i++){
//System.out.println("触控点各个点之索引"+i+":"+event.getPointerId(i));
//System.out.println("触控点各个点之坐标"+i+":"+event.getX(i));
}
}
}
总结:
1:对于多点还是单点,Android事件返回的Action
多点 | ACTION_POINTER_UP(index), ACTION_POINTER_DOWN(index) |
单点 | ACTION_DOWN,ACTION_MOVE,ACTION_UP |
3:多点触控的重点是掌握各个点的获得,以及分析运动趋势来进行业务逻辑的处理,理清Action事件的发生时机