两点触控

本文介绍了一个基于Android平台的多点触控实现方案,通过示例代码展示了如何为图片设置拖动、放大缩小等功能。文章详细解释了通过MotionEvent处理不同触控状态的方法,并提供了完整的Java代码及XML布局。

    近日做到一个项目用到了一个多点触控的问题,自己小研究了一下总结了一些小的细节给大家分享下代码如下:

这是一个给图片设置拖动,放大缩小的例子,如果想要做手势触发别的事件,直接在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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值