Android多点触摸交互处理

        触摸操作是安卓最基本的交互方法,掌握多点触摸的开发可增强应用交互体验。首先需要了解触摸事件的侦听和传递,同时,本文介绍了单点、多点触摸的使用方法,并在此基础上,使用多点触控完成了一个缩放照片的简单例子。

详细代码:github.com/Baolvlv/LearnAndroid/tree/master/MulTouch


1.触摸事件的侦听

初始化页面根布局,通过findViewById查找到

privateRelativeLayoutroot;

root= (RelativeLayout) findViewById(R.id.activity_main);

设置触摸监听器,区别于点击监听器,复写onTouch方法,根据getAction判断触摸的类型,并执行相应的操作。

//侦听触摸事件,onTouchListener

root.setOnTouchListener(newView.OnTouchListener() {

@Override

public booleanonTouch(View v,MotionEvent event) {

//根据event.getAction判断触摸类型

switch(event.getAction()){

//触摸按下事件

caseMotionEvent.ACTION_DOWN:

System.out.println("action down");

break;

//触摸移动事件

caseMotionEvent.ACTION_MOVE:

System.out.println("action move");

break;

//触摸弹起事件

caseMotionEvent.ACTION_UP:

System.out.println("action up");

break;

}

2.触摸事件的传递

触摸事件触发有顺序的依赖关系,先触发action down,再触发action move,最后触发action up

当onTouch方法返回false时,即表示后续事件不触发。返回值为true时,会触发相应的后续事件

3.获取一个android触摸点坐标

通过event.getX()和event.getY()获取单个触摸点的坐标

例如在action move事件中,输出当前坐标,右下方x,y坐标越大

//越向右下方移动,x坐标与y坐标越大

System.out.println(String.format("x:%f,y:%f",event.getX(),event.getY()));

移动图片功能的实现

通过设置imageView的布局参数,设置当前触摸的x,y坐标为左部和上部的空白,在action move事件中实现图片移动

//创建iv的布局参数对象

RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)iv.getLayoutParams();

//设置子视图在根布局中的左侧空白,为当前触摸位置

lp.leftMargin= (int) event.getX();

//设置子视图在根布局中的上部空白,为当前触摸位置

lp.topMargin= (int) event.getY();

//设置imageView的布局参数

iv.setLayoutParams(lp);

4.获取多个android触摸点坐标

通过event.getPointerCount,可以获得触摸点的个数

//获取触摸点的个数

System.out.println("point count: "+event.getPointerCount());

通过event.getX(index),添加索引可以获得不同控制点的坐标

System.out.println(String.format

("x1:%f,y1:%f x2:%f,y2:%f",event.getX(0),event.getY(0),event.getX(1),event.getY(1)));

5.缩放图片示例

通过判断两个触控点之间的距离来实现,两点间距离增大时,放大图片,否则缩小图片

设置两个点当前距离变量与上一次操作后两点距离变量

//两个触控点之间当前的距离

private floatcurrentDistence;

//两个触控点之间上一次操作后的距离

private floatlastDistence;

当触控点大于等于两个时,根据两点间距离公式计算两点之间距离

if(event.getPointerCount()>=2){

//两触控点之间的x偏移量和y偏移量

floatoffsetX = event.getX(0)-event.getY(1);

floatoffsetY = event.getY(0)-event.getY(1);

//计算两点之间的距离

currentDistence= (float) Math.sqrt(offsetX*offsetX+offsetY*offsetY);

根据lastDistance与currentDistance的大小关系判断放大还是缩小,通过iv的layoutParams改变iv的参数从而改变iv的大小

//避免实际操作中,距离计算的误差,使用两次距离差大于或小于5作为判断依据

if(currentDistance-lastDistance>5){

System.out.println("放大");

//设置imageView布局参数

RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)iv.getLayoutParams();

//放大时宽度与高度需要使用getHeight与getWidth获取到当前真实的高度与宽度

//需要使用明确浮点数进行乘法

lp.width= (int) (1.1f*iv.getWidth());

lp.height= (int) (1.1f*iv.getHeight());

iv.setLayoutParams(lp);

//更新lastDistence的值

lastDistance=currentDistance;

}else if(lastDistance-currentDistance>5){

System.out.println("缩小");

RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)iv.getLayoutParams();

lp.height= (int) (0.9f*iv.getHeight());

lp.width= (int) (0.9f*iv.getWidth());

iv.setLayoutParams(lp);

lastDistance=currentDistance;

}

你可能感兴趣的:(Android多点触摸交互处理)