event.getActionMasked()和 event.getAction()的区别

 转自 安卓多点触控之getAction()和getActionMasked()的区别_删库且跑路的博客-CSDN博客

安卓用一个32位的整型int标识一次触摸事件。

getAction()是完整地获取这个整型int。

getActionMasked()是获取这个整形int的低8位。masked有掩盖的意思,即掩盖住不重要的部分,不看了,就只有我们需要的部分。

最后8位代表这次触摸事件的类型。即我们熟悉的ACTION_DOWN、ACTION_UP、ACTION_MOVE之类的。

对于单指操作而言,getAction()和getActionMasked()的结果并没有区别,是一样的。

但对于多指操作而言,它们则代表不同的含义。
触摸事件的整形int的低9~16位的含义是指代第几只手指。
举个栗子:
手指一的ACTION_MOVE事件为 0x0001 (00000000 00000000 00000000 00000002)
手指二的ACTION_MOVE事件为 0x0101 (00000000 00000000 00000001 00000002)
手指三的ACTION_MOVE事件为 0x0101 (00000000 00000000 00000002 00000002)

所以在多指操作中我们就不能仅仅使用getAction()来判断事件类型,而需要使用getActionMasked()来截取事件类型信息进行判断

理所当然地,既然有截取事件类型的方法,肯定就有获取事件是第几根手指的方法,即getActionIndex(),它和getActionMasked()相似,是截取低9~16位(先用0xff00和整形相与,再将结果右移8位)

其实还是比较好理解的,如果对于位运算符和位移操作不理解,需要先去找这部分的相关知识进行学习。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
package com.blog.demo11; import android.annotation.SuppressLint; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; import androidx.annotation.Nullable; import com.blog.BaseActivity; import com.blog.R; import static android.view.MotionEvent.INVALID_POINTER_ID; /** * 可拖拽效果类。 */ public class ViewDragActivity extends BaseActivity { private ImageView backgroundImage; private ImageView image1; private ImageView image2; @SuppressLint("MissingInflatedId") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.drag_layout); backgroundImage = findViewById(R.id.background_image); image1 = findViewById(R.id.image1); image2 = findViewById(R.id.image2); // Set touch listeners for each image image1.setOnTouchListener(new MultiTouchListener()); image2.setOnTouchListener(new MultiTouchListener()); } private class MultiTouchListener implements View.OnTouchListener { private float lastTouchX, lastTouchY; private int activePointerId = INVALID_POINTER_ID; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: { final int pointerIndex = event.getActionIndex(); final float x = event.getX(pointerIndex); final float y = event.getY(pointerIndex); lastTouchX = x; lastTouchY = y; activePointerId = event.getPointerId(pointerIndex); break; } case MotionEvent.ACTION_MOVE: { final int pointerIndex = event.findPointerIndex(activePointerId); final float x = event.getX(pointerIndex); final float y = event.getY(pointerIndex); final float dx = x - lastTouchX; final float dy = y - lastTouchY; v.setX(v.getX() + dx); v.setY(v.getY() + dy); lastTouchX = x; lastTouchY = y; break; } case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: { activePointerId = INVALID_POINTER_ID; break; } case MotionEvent.ACTION_POINTER_UP: { final int pointerIndex = event.getActionIndex(); final int pointerId = event.getPointerId(pointerIndex); if (pointerId == activePointerId) { final int newPointerIndex = pointerIndex == 0 ? 1 : 0; lastTouchX = event.getX(newPointerIndex); lastTouchY = event.getY(newPointerIndex); activePointerId = event.getPointerId(newPointerIndex); } break; } } return true; } } }
06-04

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值