MotionEvent事件对象
一般我们是在View的onTouchEvent方法中处理MotionEvent对象的.
public boolean onTouchEvent(MotionEvent event)
在这里我们需要从一个MotionEvent对象中获得信息
(1)首先应该是事件的类型
可以通过getAction(),在android2.2之后加入多点触控支持之后使用getActionMasked()方法.
这两个方法的区别见后文.
主要的事件类型有:
- ACTION_DOWN: 表示用户开始触摸.
- ACTION_MOVE: 表示用户在移动(手指或者其他)
- ACTION_UP:表示用户抬起了手指
- ACTION_CANCEL:表示手势被取消了,一些关于这个事件类型的讨论见:http://stackoverflow.com/questions/11960861/what-causes-a-motionevent-action-cancel-in-android
还有一个不常见的:
5. ACTION_OUTSIDE: 表示用户触碰超出了正常的UI边界.
但是对于多点触控的支持,Android加入了以下一些事件类型.来处理,如另外有手指按下了,
有的手指抬起来了.等等:
- ACTION_POINTER_DOWN:有一个非主要的手指按下了.
- ACTION_POINTER_UP:一个非主要的手指抬起来了
(2)事件发生的位置,x,y轴
- getX() 获得事件发生时,触摸的中间区域在屏幕的X轴.
- getY() 获得事件发生时,触摸的中间区域在屏幕的X轴.
在多点触控中还可以通过:
3. getX(int pointerIndex) ,来获得对应手指事件的发生位置. 获得Y轴用getY(int pointerIndex)
(3)其他属性
getEdgeFlags():当事件类型是ActionDown时可以通过此方法获得,手指触控开始的边界. 如果是的话,有如下几种值:EDGE_LEFT,EDGE_TOP,EDGE_RIGHT,EDGE_BOTTOM
例子:
/**
* 手指按下的点为(x1,y1)
* 手指离开屏幕的点为(x2,y2)
*/
float x1 = 0;
float y1 = 0;
float x2 = 0;
float y2 = 0;
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
//当手指按下的时候
x1 = event.getX();
y1 = event.getY();
}
if (event.getAction() == MotionEvent.ACTION_MOVE){
x2 = event.getX();
y2 = event.getY();
//当手指离开的时候\
if (Math.abs(x2 - x1) <10){
Toast.makeText(this, "待加功能......", Toast.LENGTH_SHORT).show();
}
}
if (event.getAction() == MotionEvent.ACTION_UP) {
x2 = event.getX();
y2 = event.getY();
if (y1 - y2 > 200) {//向上滑
Toast.makeText(this, "待加功能......", Toast.LENGTH_SHORT).show();
} else if (y2 - y1 > 800) {//向下滑
Toast.makeText(this, "待加功能......", Toast.LENGTH_SHORT).show();
} else if (x1 - x2 > 200) {//向左滑
Toast.makeText(this, "待加功能......", Toast.LENGTH_SHORT).show();
} else if (x2 - x1 > 200) {//向右滑
Toast.makeText(this, "待加功能......", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(this, "待加功能......", Toast.LENGTH_SHORT).show();
}
}
return super.onTouchEvent(event);
}