您的位置:首页 > 移动开发 > Android开发

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

2014-05-13 11:08 991 查看

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坐标
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: