Android 简述touch事件中的MotionEvent

有关touchEvent的事件里都有一个 MotionEvent 参数,下面来简单介绍一下它的属性的一些含义和使用的方法

通常单指操作时,一般如下:

switch (event.getAction()) {//第一个触摸点
	case MotionEvent.ACTION_DOWN:  //按下 = 0
	float x = event.getX();
		break;
	case MotionEvent.ACTION_MOVE:  //移动 = 2
			
		break;
	case MotionEvent.ACTION_UP:    // 抬起 = 1
			
	break;
}

多点触摸时:

以下属性在api level 5出现,api level 8过时。

MotionEvent.ACTION_POINTER_1_DOWN
MotionEvent.ACTION_POINTER_2_DOWN
MotionEvent.ACTION_POINTER_3_DOWN
MotionEvent.ACTION_POINTER_1_UP
MotionEvent.ACTION_POINTER_2_UP
MotionEvent.ACTION_POINTER_3_UP

api level 8 即2.2后起用:MotionEvent.ACTION_POINTER_DOWN 、MotionEvent.ACTION_POINTER_UP

通过以下测试发现,多点触摸时,

switch (event.getAction()) {
//		case MotionEvent.ACTION_DOWN: //按下 = 0
//			System.out.println("onTouchEvent");
//			break;
//		case MotionEvent.ACTION_MOVE://移动 = 2
//			
//			break;
//		case MotionEvent.ACTION_UP:// 抬起 = 1
//			
//			break;
			
		case MotionEvent.ACTION_POINTER_DOWN://非第一个触摸点按下  = 5
			System.out.println("ACTION_POINTER_DOWN");
			break;
			
		case MotionEvent.ACTION_POINTER_UP: //非第一个触摸点抬起   = 6
			System.out.println("ACTION_POINTER_UP");
			break;
		default:
			break;
}

MotionEvent.ACTION_POINTER_DOWN、MotionEvent.ACTION_POINTER_UP  未执行

当屏幕上已经有一个点被按住,此时再按下其他点时,才会触发MotionEvent.ACTION_POINTER_DOWN

第二个点以后取x、y坐标值

float x2 = event.getX(event.getActionIndex());//action index 从0开始到pointer count -1 结束
float y2 = event.getY(event.getActionIndex());//某个index的触摸点的 相对于当前view的y坐标
event.getPointerCount(); //触摸点的数量

多点时获取坐标 索引 id 示例

		int pointerCount = event.getPointerCount();
//		switch (event.getAction() & MotionEvent.ACTION_MASK) {
		switch (event.getActionMasked()) {
		case MotionEvent.ACTION_DOWN:
		case MotionEvent.ACTION_POINTER_DOWN:
		case MotionEvent.ACTION_MOVE:
			for (int i = 0; i < pointerCount; i++) {
				int id = event.getPointerId(i); //同一点的id值保持不变
				int index = i;//同一点的索引值,是可变的,当由多指逐渐减少时,index--
				 dx = (int) event.getX(id);
				 dy  = (int) event.getY(id);
			}
			invalidate();
			break;
		case MotionEvent.ACTION_CANCEL:

		default:
			break;
		}

示例

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                System.out.println("ACTION_DOWN");
                mDownX = (int) event.getX();
                mDownY = (int) event.getY();
                if (flag) {
                    return true; //对于onTouchEvent,要return true,才能执行后续的 move,up
                } else {
                    break;
                }

            case MotionEvent.ACTION_MOVE:
                System.out.println("move");
                int moveX = (int) event.getX();
                int moveY = (int) event.getY();
               
                break;

            case MotionEvent.ACTION_UP:
                System.out.println("ACTION_UP");
                break;

            case MotionEvent.ACTION_POINTER_DOWN: //当屏幕上已经有一个点被按住,此时再按下其他点时触发
                System.out.println("ACTION_POINTER_DOWN");

                break;

            case MotionEvent.ACTION_POINTER_UP:
                System.out.println("ACTION_POINTER_UP");

                break;

        }
        return super.onTouchEvent(event);
    }


输出:

06-06 23:25:38.974 11930-11930/com.immoc.canvaspath I/System.out: ACTION_DOWN
06-06 23:25:38.974 11930-11930/com.immoc.canvaspath I/System.out: ACTION_POINTER_DOWN
06-06 23:25:39.202 11930-11930/com.immoc.canvaspath I/System.out: move
06-06 23:25:39.218 11930-11930/com.immoc.canvaspath I/System.out: move
06-06 23:25:39.234 11930-11930/com.immoc.canvaspath I/System.out: move
06-06 23:25:39.250 11930-11930/com.immoc.canvaspath I/System.out: move
06-06 23:25:39.334 11930-11930/com.immoc.canvaspath I/System.out: ACTION_POINTER_UP
06-06 23:25:39.334 11930-11930/com.immoc.canvaspath I/System.out: ACTION_UP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值