Android 控件的触摸事件传递与处理

本文详细介绍了Android控件的触摸事件传递与处理机制,包括ACTION_DOWN、ACTION_MOVE、ACTION_UP等事件的顺序,以及如何通过dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent方法进行事件分发和拦截。通过一个家庭吃苹果的比喻,展示了触摸事件在Activity、父控件和子控件之间的传递过程,帮助开发者理解如何解决自定义控件和触摸事件冲突问题。
摘要由CSDN通过智能技术生成

  了解Android控件的触摸事件传递与处理对我们日常开发中自定义控件和触摸事件冲突解决有重大意义。Android控件的触摸事件传递和处理主要有以下几个方法,下面一一介绍。

  一、与触摸事件有关的几个方法

boolean dispatchTouchEvent(MotionEvent ev);                                                                                              
接收到触摸事件时,是否分发事件到下面的View
返回true:分发触摸事件
返回false:不分发,下面的View就拿不到触摸事件
boolean onInterceptTouchEvent(MotionEvent ev);
接收到触摸事件时,是否拦截事件
返回true:拦截,则调用onTouchEvent方法处理事件
返回false:不拦截,事件继续往子View传
boolean onTouchEvent(MotionEvent ev);
是否响应事件
返回true:响应
返回false:不响应
boolean onTouch(View v, MotionEvent event);
是否响应事件,当View调用了setOnTouchListener方法设置了触摸监听器,则事件响应的时候先调用onTouch方法
返回true:响应,则onTouchEvent方法不执行
返回false:不响应,并调用onTouchEvent方法

void requestDisallowInterceptTouchEvent(boolean disallowIntercept); 
请求父控件是否不拦截事件
返回true:不允许父控件的onInterceptTouchEvent调用
返回false:允许调用


  二、拥有这些方法的类

父类 子类 拥有的方法
Activity Activity dispatchTouchEvent、onTouchEvent

ViewGroup                                                       
RelativeLayout, LinearLayout...                                                                                  dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent、requestDisallowInterceptTouchEvent  
View Button、TextView... dispatchTouchEvent、onTouchEvent


  三、事件处理规则

  触摸事件是从Activity分发(只是分发,还没有处理)到父控件,父控件先判断是否拦截,如果不拦截事件,则继续分发到子控件,然后一直往下分发。但处理就刚好相反,由子控件先处理事件,如果子控件没有处理事件,则交给到父控件处理,一直往上处理,直到哪个控件处理了触摸事件,就事件处理就到此结束。

  1.当用户触摸屏幕的时候,从按下到移动,最后到抬起,会依次产生ACTION_DOWN、ACTION_MOVE、ACTION_UP三种触摸事件,事件先传到Activity,然后Activity调用分发事件方法dispatchTouchEvent,如果返回true,则事件就会传给Activity的第一个父控件。

  2.父控件拿到事件之后,也会调用分发事件方法dispatchTouchEvent,如果返回true,则继续调用拦截方法onInterceptTouchEvent,如果返回true,则父控件拦截了事件,并调用父控件的onTouchEvent方法,下面的子控件就不会再响应onTouchEvent,onTouch的方法。

  3.子控件拿到事件之后,先判断是否设置了OnTouchListener, 如果设置了,则调用OnTouchListener的onTouch方法,如果返回true,事件已经处理到此结束,则跳过onTouchEvent方法,否则调用onTouchEvent方法,当onTouchEvent方法返回true,则事件处理到此结束,上面的父控件就不会再调用onTouchEvent方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值