Android菜鸟日记13 触控

Android菜鸟日记13
触控

Ontouch:
简介:
Ontouch(Event) 是在activiy中给UI的触摸事件监听器的调用函数[按下、移动、松开等]
返回值为boolean 返回值决定是否使用此事件
细节:
UI.setOnTouchListener(监听器)
Ontouch函数 是触摸事件监听器的回调函数。
当被绑定的UI发生了触摸事件,则调用监听器的Ontouch()

ontouchEvent():
简介:
ontouchEvent(Event),是具体UI类中编写的触摸事件监听器。
返回值为boolean返回值决定是否使用此事件
细节:
当activity中的UI被点击后 先调用Ontouch(),如果Ontouch()返回false则执行被触摸的UI的ontouchEvent()。

1.activity是先进入Ontouch如果返回false,ontouchEvent才执行.
如果ontouchEvent也返回false则此UI对此事件[Event]不使用。
此时android会不断地在当前activity中另一UI对象来处理此[event]事件。

PS:比如一个按钮 如果我们不使用他的点击event,则按钮会被按下去后不弹出
因为,我们使用点击event,则在我们手指抬起时,android会发出一个抬起event,
而我们不适用点击event,则我们手指抬起时,android不会发出抬起event,则按钮无法抬起。


PS2:关于为什么按钮不变化
系统内置的UI的变化都是在ontouchEvent()执行的,如果在activty中的Ontouch()返回了true,则就不执行ontouchEvent()了 系统内置的UI就无法显示系统的按钮效果了(button的点击效果之类的)
所以要让系统的内置UI显示他的按钮效果,则需要在Ontouch()返回true前,调用ontouchEvent(Event)。

Ps3:
如果按钮出现双false,Android每次仅停止一个触摸序列事件发送到按钮。
对于新的触摸序列事件 将会重新发送会按钮。
也就是说,出现双false[ontouch(),ontouchEvent()]时 停止的只是当前的触摸事件队列发送到按钮,新的触摸事件队列到来时则还会发送到刚才被停止的按钮。




多点触控:
多点触控的时候
也是写在ontouch  或ontouchEvent
通过event.getPointerId() 获得几点触摸。
event.getX(ptridX) // ptridX 第几个触摸点  从0开始  获得此点的X
event.getX(ptridX)//                              获得此点的Y
event.getXXXXX(大多都是传入引索号的)

注意:
手指(触摸)引索:当前手指是第几个触摸的手指,如果前面的手指离开了引索会减少。[比如 原本是1 但是前面的0走了 ,1就变成了0]
手指(触摸)ID:当手指触摸后就会分配给他ID,手指离开不会对其他手指ID影响,但是新进入的手指ID会从0开始找到一个没有使用的id(比如ID 0 ,1 如果0 走了 1不变,但是新进入的并不是2,而是重新使用0)
总结一下:
引索至于当前手指触摸的顺序有关。
而ID是已进入即不可改变,且数字不留空。后面进来的会补充空缺的。


一、在多点触摸时,第二个手指先离开。
1:当点下第一个点时 action应该是0,此时还是认为是单点触摸。
此时此手指引索为0,ID为0;
2:当殿下第二个点时:action应该是261。第二个手指的引索为:1 ID:1
多点触摸的action(简单的说就是id*256+多点action[多点时5 down 6 up 2 move 单点时0 down 1up 2 move ] 261其实是16进制数0x00000105 第三位表示id 第一位表示action[多点时5 down 6 up 2 move 单点时0 down 1up 2 move ])此时已经被认为是多点触摸了。
3 : 当松开第二个手指时,action应该为:262,(256+6):
此时认为是多点触摸离开一个手指。
4:再松开第一个手指时,action应该为:1
此时只有一个手指在屏幕上,所以认为是单点触摸。

二、第一个手指先离开
1,2相同
3,当松开第一个手指时:action应该为:6(0*256+6)
此时认为是多点触摸。ID为0的手指离开。第二个手指的引索变为0,id还是1.
4: 当第二个手指 离开时,action为:1
此时如果按照前面的理论应该输出262(1*256+6) 但是android认为最后一个来开的手指触发的action必为1。

三、第一个手指先离开再按回来。
1,2相同
3,当松开第一个手指时:action应该为:6(0*256+6)
此时认为是多点触摸。ID为0的手指离开。第二个手指的引索变为0,id还是1.
4,当点回第一个手指时:aciton应该为:6
此时认为是多点触摸。ID为0的手指进入,引索为1。[此时第二个手指id为1,引索为0]
[新进入的手指会从0开始找ID如果 空缺就是用 而引索只是触摸的时间上的先后顺序来决定的]
5,当第二个手指离开时:action应该为:262(256+6)
如一的3~4

掩码
Android提供了 掩码可以让我们方便的找到id 动作action等
Int action=Event.getAction
ptrID=(action&ACTION_POINTER_ID_MASK)>>> ACTION_POINTER_ID_SHITF  //获得ID
0x0000ff00                0x00000008
action=action&ACTION_MASK //获得动作id
0x000000ff
If(action<7&&action>4)
{
Action=action-5;   //把多点触摸动作action转为单点action
}
说明:
Action的构成是0x0000xxyy(xx为2位id) (yy为2位动作)。
要获得id时只需要&上一个只保留xx的数,然后向右移位8位。[移位是考虑2进制而这里是16进制的数字所以是8而不是2位]
0x0000ff00 之所是2个ff是因为移位和并(&)都是考虑2进制的ff那两位是要的所以要让那两位转成2进制后都是1,16制FF转成2进制是11111111;
而16进制向右移动2位,就是16*16=256[10进制]
就是8位2进制。所以>>>一个0x00000008
而要获得动作action则只需要最后2位所以&一个0x000000ff即可。
此时获得的可能是多点或者单点,再加个一个条件判断,统一让其变为单点的。
好判断此触摸ID的动作。


总结:
1.引索至于当前手指触摸的顺序有关。
2.而ID是已进入即不可改变,且数字不留空。后面进来的会补充空缺的。
3.action为id*256+动作ACTION
【动作ACTION:多点时5 down 6 up 2 move 单点时0 down 1up 2 move】
4.最后离开的手指触发的action必为1,与他的id号无关。
5. event.getXXXXX(大多都是传入引索号的)
6.通过掩码我们可以快速的获得出入的事件的手指(触摸)ID ,和动作。
ptrID=(action&ACTION_POINTER_ID_MASK)>>> ACTION_POINTER_ID_SHITF  //获得ID
action=action&ACTION_MASK //获得动作id




2011-9-11
poolo

你可能感兴趣的:(android)