Android Touch系统学习整理



基于大牛maxleng的文章学习整理:http://blog.csdn.net/maxleng, 其中带有数字的是自己已经写的文章





由末端向上整理

onTouch执行 action等

onTouch与Click的关系 (属于系统手势判断)

onTouch与手势判断(属于自定义手势判断)


如何传递?Event从哪来的?

onTouch与onInterceput的关系

三者关系


---------------------------

    Android Touch相关的一些简单规则

一 、MotionEvent对象简单学习

1 位置信息:Android Touch事件rawX,rawY与x,y的区别

2. Touch action Android Touch 单点触摸Action

3. 修改MotionEvent的值

 


二、基于源码析Touch Event传递机制

    Android 处理Touch Event是先有系统获取到事件,之后传递给当前显示的Activity,之后再逐级向下派发直到传递给Touch正下方的View为止,当然此View也可以选择不处理Touch Event

1. Touch Event接收并传递给Activity   -- Activity是在何处接收到Touch Event以及如何向下派发

2. VewGroup.dispatchTouchEvent源码简单分析  --  Activity把Touch Event向下派发,此处分析ViewGroup向下派发流程

3. 分析Touch 与Click的关系  --  派发的具体的View,View会进行一些常用操作处理,例如点击事件。


疑问: 
1.  手机如何接收到Touch Event?
2. Service端如何处理?
3. 为什么事件要每次派发一个ACTION操作?
4. 为什么要以树形结构又上向下派发?
5. Touch Event 使用生产者消费者模式,简单实现一个?
6. Touch Event传递简单实现一个?
7. onTouchEvent, onInterceptTouchEvent, dispatchTouchEvent 每个方法具体含义?如何处理派发流程?




疑问:
1. 触摸屏幕材质有何区别?
2. 硬件如何传递信息给驱动?
3. 驱动如何传递信息给Linux?
4. Android 如何从Linux获取此信息?
5. Android内部如何处理的?

以上疑问参考资料:


资料整理:


------------------------规则

1.  Touch事件是UI树形机构,由上向下传递。如果点击手机界面中的一个Button,其先传递给最外层的视图,经过层层向下传递给Button的父视图,其父视图再传递给Button处理。


2. 具体处理方法是View.onTouchEvent(MotionEvent event)


3. MotionEvent 中包含多种触屏操作,每种操作都用一个唯一的ID来标识,并且这些ID声明成为常量,最常见的就是ACTION_DOWN, ACTION_MOVE,  ACTION_UP, ACTION_CANCEL四种动作。如果点击屏幕后慢慢移动,会执行的操作是,仅执行一次ACTION_DOWN, 移动过程中执行多次ACTION_MOVE, 抬起手指执行ACTION_UP。


4. 在1中提到Touch事件是从上向下传递的,在3中又提到触屏又有多种操作,这些操作是如何传递给需要具体操作的View的?  答案是每次操作都是从UI树形结构的上向下传递,例如ACTION_DOWN, ACTION_MOVE, ACTION_MOVE, ACTION_MOVE, ACTION_UP,一次触屏动作包含5个具体的操作,相当于UI树由上向下传递5次,第一个操作ACTION_DOWN操作并处理完成之后,再传递第二个操作ACTION_MOVE依此类推,直到执行完5此传递为止。


5. 具体是如何传递的? 涉及两方面,其一是UI树形结构决定了Touch传递的上下结构,其二是三个方法,包括负责分发Touch事件的View.dispatchTouchEvent, 处理拦截Touch事件ViewGroup.onInterceptTouchEvent, 视图针对触屏事件具体处理View.onTouchEvent,这三个方法决定了传递的具体流程。


6. 事件消耗,事件处理 - 指ACTION_DOWN, ACTION_MOVE,  ACTION_UP, ACTION_CANCEL任一操作,只可能有两种情况。一 某一视图处理,可以叫做这个视图消耗了此次事件或者这个事件由此视图处理了,其他视图不再处理。 二 没有任何视图处理此事件。


7. Event.getX() 与 Event.getY() 向上移动,向下移动偏移值,正或负





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值