1.检查当前屏幕有多少个触摸点。
使用MotionEvent的getPointerCount()方法。
2.多点触控下,触摸的状态的检测
MotionEvent类中方法getActionMasked(),这个方法可以检查触摸的状态:
当只有一个触摸点时(只用一根手指触摸屏幕),按下是0,起来是1,移动是2;
当触摸点多于1时(多根手指触摸屏幕),按下是5,起来是6,移动是2;
3.多点触控下,每个触点的分类处理
多点触摸时 假如是第i个点 int x = event.getX(i); int y = event.getY(i);则第i个点的坐标就是 P(x,y)
通过event.getActionIndex()来得到触控操作点的索引,也就是获取当前这个动作是第几个触点。
4.多点触控下的几个特殊事件
MotionEvent.ACTION_POINTER_DOWN:当屏幕上已经有一个点被按住,此时再按下其他点时触发。
MotionEvent.ACTION_POINTER_UP:当屏幕上有多个点被按住,松开其中一个点时触发(即非最后一个点被放开时)。
5.如何精确模拟一个手势事件对象
static public MotionEvent obtain(long downTime, long eventTime, int action, int pointerCount, PointerProperties[] pointerProperties, PointerCoords[] pointerCoords, int metaState, int buttonState, float xPrecision, float yPrecision, int deviceId, int edgeFlags, int source, int flags) { MotionEvent ev = obtain(); ev.mNativePtr = nativeInitialize(ev.mNativePtr, deviceId, source, action, flags, edgeFlags, metaState, buttonState, 0, 0, xPrecision, yPrecision, downTime * NS_PER_MS, eventTime * NS_PER_MS, pointerCount, pointerProperties, pointerCoords); return ev; }
该方法用来获取一个模拟事件,参数意义为:】
参数1:downTime,用户最初按下以启动一连串的位置事件时的时间,这个时间值必须是从SystemClock的uptimeMillis()方法获取到的才行。
参数2:eventTime,这个手势事件创建的时间,这个时间值必须是从SystemClock的uptimeMillis()方法获取到的才行。
参数3:action ,想要模拟动作的类型,比如:ACTION_DOWN等
参数4:pointerCount,这个时间中触点的数目
参数5:pointerProperties,一个大小为pointerCount的数组,为每一个点提供PointerProperties类型的对象,这个对象必须包括点的标示符。
参数6:pointerCoords,一个大小为pointerCount的数组,为每一个点提供PointerCoords类型的对象
参数7:metaState,当事件形成时,起了作用的修饰键也叫元键,比如shift,ctrl,alt键,这些键的状态
参数8:buttonState,被按下的按钮的状态
参数9:xPrecision,X坐标的精度
参数10:yPrecision,Y坐标的精度
参数11:deviceId,产生这个事件的设备的id。如果是0表示事件不是一个物理设备产生的,其他值都是任意的并且你不能依赖这些任意值
参数12:edgeFlags,一个位字段值,表明屏幕的哪个边框,如果有的话,被这个手势碰到了。
参数13:source,这个事件的源
参数14:手势事件的标记
6.非精确模拟一个手势事件对象
模拟一个MotionEvent对象,这里我们使用MotionEvent的obtain()方法,参数如下
MotionEvent.obtain(downTime, eventTime, action, x, y, metaState);
7.模拟点击
在屏幕中间模拟一次ACTION_DOWN事件
另外你要模拟滑动事件则模拟成MotionEvent.ACTION_MOVE即可
onTouch(mPageView, MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, screenWidth / 2, screenHeight / 2, 0));
8.常用方法
Android多点触控
event.getAction() //获取触控动作比如ACTION_DOWN
event.getPointerCount(); //获取触控点的数量,比如2则可能是两个手指同时按压屏幕
event.getPointerId(nID); //对于每个触控的点的细节,我们可以通过一个循环执行getPointerId方法获取索引
event.getX(nID); //获取第nID个触控点的x位置
event.getY(nID); //获取第nID个点触控的y位置
event.getPressure(nID); //LCD可以感应出用户的手指压力,当然具体的级别由驱动和物理硬件决定的
event.getDownTime() //按下开始时间
event.getEventTime() // 事件结束时间
event.getEventTime()-event.getDownTime()); //总共按下时花费时间
getX()和getRawX()的区别
getX()是表示Widget相对于自身左上角的x坐标,而getRawX()是表示相对于屏幕左上角的x坐标值(注意:这个屏幕左上角是手机屏幕左上角,不管activity是否有titleBar或是否全屏幕),getY(),getRawY()一样的道理
当用于触控时:
getRowX:触摸点相对于屏幕的坐标
getX:触摸点相对于按钮的坐标
getTop:按钮左上角相对于父view(LinerLayout)的y坐标
getLeft:按钮左上角相对于父view(LinerLayout)的x坐标
android点滴之触控相关知识点(持续更新)