android 多手指触摸屏,android 多指触摸的一些基本原理

最近想在项目中实现多指操作,可惜android原生的sdk对多指的支持不太好,只能自己写了。下面是我在网上查到的一些关于多指触摸的一些资料。

在android的中,MotionEvent event代表的是一个触摸事件。我们对屏幕的几乎所有操作都会触发该事件,如点击、放开、滑动等。不同的事件在MotionEvent中有不同的id,根据id的不同可以判断触摸事件属于哪个手指。我们还可以根据event.getAction() & MotionEvent.ACTION_MASK的结果来判断是何种事件,是ACTION_DOWN、ACTION_UP还是ACTION_MOVE。下面介绍下我们将使用到的五个操作:

MotionEvent.ACTION_DOWN:在第一个点被按下时触发

MotionEvent.ACTION_UP:当屏幕上唯一的点被放开时触发

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

MotionEvent.ACTION_POINTER_UP:当屏幕上有多个点被按住,松开其中一个点时触发(即非最后一个点被放开时)。

MotionEvent.ACTION_MOVE:当有点在屏幕上移动时触发。值得注意的是,由于它的灵敏度很高,而我们的手指又不可能完全静止(即使我们感觉不到移动,但其实我们的手指也在不停地抖动),所以实际的情况是,基本上只要有点在屏幕上,此事件就会一直不停地被触发。

举例来讲:当我们放一个食指到屏幕上时,触发ACTION_DOWN事件;再放一个拇指到屏幕上,触发ACTION_POINTER_DOWN事件;此时再把食指或拇指放开,都会触发ACTION_POINTER_UP事件;再放开最后一个手指,触发ACTION_UP事件;而同时在整个过程中,ACTION_MOVE事件会一直不停地被触发。

根据上面这些原理,就可以判断在触摸过程中有多少个手指在屏幕上:

switch (event.getAction() & MotionEvent.ACTION_MASK) {

case MotionEvent.ACTION_DOWN:

mode = 1;

break;

case MotionEvent.ACTION_UP:

mode = 0;

break;

case MotionEvent.ACTION_POINTER_UP:

mode -= 1;

break;

case MotionEvent.ACTION_POINTER_DOWN:

mode += 1;

break;

}

假如现在有两个手指在触摸屏上,可通过如下方法分别获得这两个触摸点的位置:

float x1 = event.getX(0);

float y1 = event.getY(0);

float x2 = event.getX(1);

float y2 = event.getY(2);

上面大体就是多指触摸的基本原理了。要在这个基础之上实现多指触摸,还有很长的路要走。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,可以通过实现`OnTouchListener`接口来检测手指触摸事件,包括手指按下、移动和离开屏幕。当有多个手指在屏幕上时,可以使用`MotionEvent`对象来追踪每个手指触摸事件。 要检测手指离开屏幕,可以在`onTouch()`回调方法中检查`MotionEvent`对象的`ACTION_POINTER_UP`事件,该事件表示手指已经离开了屏幕。你需要检查离开的手指是否是第二个手指,并且还需要检查还有没有其他手指在屏幕上。例如: ```java @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getActionMasked(); int pointerIndex = event.getActionIndex(); int pointerId = event.getPointerId(pointerIndex); switch (action) { case MotionEvent.ACTION_DOWN: // 处理第一个手指按下事件 break; case MotionEvent.ACTION_POINTER_DOWN: // 处理第二个及以上手指按下事件 break; case MotionEvent.ACTION_MOVE: // 处理手指移动事件 break; case MotionEvent.ACTION_POINTER_UP: // 处理手指离开事件 if (pointerId == 1) { // 如果第二个手指离开了屏幕 int newPointerIndex = pointerIndex == 0 ? 1 : 0; // 检查还有没有其他手指在屏幕上 if (event.getPointerCount() == 2) { // 只有一个手指在屏幕上,重置状态 // ... } } break; case MotionEvent.ACTION_UP: // 处理最后一个手指离开事件 break; } return true; } ``` 在这个例子中,当第二个手指离开屏幕时,我们检查当前还有没有其他手指在屏幕上。如果只有一个手指在屏幕上,我们可以重置状态或者执行其他操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值