近日做到一个项目用到了一个多点触控的问题,自己小研究了一下总结了一些小的细节给大家分享下代码如下:
这是一个给图片设置拖动,放大缩小的例子,如果想要做手势触发别的事件,直接在MotionEvent.ACTION_MOVE中作出相应的处理就ok了
package cn.miao.drageandscale;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 MainActivity extends Activity {
private ImageView imageview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageview = (ImageView) findViewById(R.id.imageview);
imageview.setOnTouchListener(new MyTouchListener());//设置触摸事件
}
private final class MyTouchListener implements OnTouchListener{
private PointF startPoint = new PointF();//开始点
private Matrix mCurrentMatrix = new Matrix();
private Matrix matrix = new Matrix();
private int type = 0;
private final static int DRAGE = 1;//拖拽
private final static int SCALE = 2; //缩放
private PointF midPoint;
private float startDistance;
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
int action = event.getAction()&MotionEvent.ACTION_MASK;
switch (action) {
case MotionEvent.ACTION_DOWN://手指按下
type = DRAGE;
startPoint.set(event.getX(), event.getY());
mCurrentMatrix.set(imageview.getImageMatrix());//图片未移动之前的状态
break;
case MotionEvent.ACTION_MOVE://手指在移动
if(type == DRAGE){
matrix.set(mCurrentMatrix);//在未移动之前的基础上进行移动
float dx = event.getX() - startPoint.x;//得到x轴移动的距离
float dy = event.getY() - startPoint.y;//得到y轴移动的距离
matrix.postTranslate(dx, dy);//移动
}else if(type == SCALE){
matrix.set(mCurrentMatrix);//在未缩放之前的基础上进行缩放
float distance = getDistance(event);//得到当前两点之间的距离
float sx = distance/startDistance;//得到缩放倍数
matrix.postScale(sx, sx, midPoint.x, midPoint.y);//缩放
}
break;
case MotionEvent.ACTION_POINTER_DOWN://屏幕上一根手指,再有一根手指按下
type = SCALE;
mCurrentMatrix.set(imageview.getImageMatrix());//图片没有缩放之前的状态
midPoint = getPoint(event);//得到中心点
startDistance = getDistance(event);//得到两点之间的初始距离
break;
case MotionEvent.ACTION_POINTER_UP://原来屏幕上有2根手指,先有一根手指弹起,屏幕上还有一根手指
case MotionEvent.ACTION_UP://手指弹起
type = 0;
break;
default:
break;
}
imageview.setImageMatrix(matrix);//把改变之后的Matrix设置给图片
return true;
}
}
/**
* 得到中心点
* @param event
* @return
*/
public PointF getPoint(MotionEvent event) {
// TODO Auto-generated method stub
float x = (event.getX(1) + event.getX(0))/2;
float y = (event.getY(1) + event.getY(0))/2;
return new PointF(x, y);
}
/**
* 得到两点之间的距离
* @param event
* @return
*/
public float getDistance(MotionEvent event) {
// TODO Auto-generated method stub
float dx = event.getX(1) - event.getX(0);
float dy = event.getY(1) - event.getY(0);
return FloatMath.sqrt(dx*dx + dy*dy);
}
}
xml文件代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ImageView android:id="@+id/imageview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="matrix"
android:src="@drawable/happiness" />
</LinearLayout>