motionEvent.getActionMasked() 作用
时间: 2024-02-26 18:52:15 浏览: 16
motionEvent.getActionMasked() 是 Android 中 MotionEvent 类的一个方法,它的作用是获取 MotionEvent 中的动作代码,忽略指针标识符信息。在多点触控的情况下,一个 MotionEvent 中可能有多个指针,而每个指针在移动过程中都会产生不同的动作代码。getActionMasked() 方法会返回最近一个触发的动作代码,但忽略其中的指针标识符信息,如 ACTION_POINTER_DOWN 和 ACTION_POINTER_UP 等。
相关问题
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; } } }
这是一个实现了可拖拽效果的 Android Activity 类,其中包含了三个 ImageView,分别是背景图 backgroundImage 和两个可拖拽的图片 image1 和 image2。通过实现 View.OnTouchListener 接口,对每个 ImageView 设置触摸事件监听器 MultiTouchListener,实现了图片的拖拽效果。在 MultiTouchListener 中,通过 MotionEvent 对象获取触摸事件的类型和坐标,计算出拖拽的偏移量,再调用 v.setX() 和 v.setY() 方法实现图片的移动,最终实现了可拖拽效果。
android MotionEvent详解
Android MotionEvent 是一个封装了触摸屏或鼠标事件的类,我们可以通过它来获取用户在屏幕上的操作信息,例如按下、抬起、移动等。下面是 MotionEvent 的一些详细解释:
1. MotionEvent.ACTION_DOWN:表示手指按下事件,这个事件在一个手势中只会发生一次。
2. MotionEvent.ACTION_MOVE:表示手指移动事件,当手指在屏幕上滑动时,会触发多个 MOVE 事件。
3. MotionEvent.ACTION_UP:表示手指抬起事件,这个事件在一个手势中只会发生一次。
4. MotionEvent.ACTION_CANCEL:表示事件被取消,例如由于突然来电,导致事件被中断。
5. MotionEvent.getPointerCount():获取当前触摸了屏幕的手指数量。
6. MotionEvent.getX() 和 MotionEvent.getY():获取当前手指在屏幕上的坐标位置。
7. MotionEvent.getActionIndex():获取当前事件的索引值,用于多点触控时区分不同的手指。
8. MotionEvent.getActionMasked():获取当前事件的类型,例如 DOWN、MOVE、UP 等。
9. MotionEvent.getPointerId():获取当前事件的手指 ID,用于多点触控时区分不同的手指。
10. MotionEvent.getHistoricalX() 和 MotionEvent.getHistoricalY():获取当前手指之前的历史坐标位置。
注意:在处理多点触控事件时,需要使用 MotionEventCompat 和 MotionEventCompat.PointerProperties 这两个类来获取手指的 ID 和指针属性。