參考: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事件的發生時機