首页 > 代码库 > android点滴之触控相关知识点(持续更新)

android点滴之触控相关知识点(持续更新)

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坐标