Android事件分发机制

本文详细介绍了Android中Touch事件的分发、拦截与响应机制。包括Activity、ViewGroup及View三个层级如何处理TouchEvent的方法,以及它们之间的默认交互流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Touch 事件相关方法   方法功能 
  ViewGroup   
       View       
     Activity     
  public boolean dispatchTouchEvent(MotionEvent ev) 事件分发 
 Yes  Yes  Yes
  public boolean onInterceptTouchEvent(MotionEvent ev) 
事件拦截 
 Yes  No  No
  public boolean onTouchEvent(MotionEvent ev) 事件响应 
 Yes  Yes  Yes

默认流程: activity:分发:=> viewgroup:分发=>viewgroup:拦截=>view :分发=>view:onTouch=>viewgroup:onTouch=>activity:onTouch

事件分发:public boolean dispatchTouchEvent(MotionEvent ev)

:由最外层传入内层,由父控件传给子控件。

return true:由当前dispatchTouchEvent消费,并将停止向下传递,事件到此结束;

return false:事件将返回给父空间或activity(向外传递)的onTouch消费;

如果返回系统默认的 super.dispatchTouchEvent(ev),事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。

事件拦截public boolean onInterceptTouchEvent(MotionEvent ev) 

:当外层事件拦截方法返回值为默认时,事件会自动分发给当前的拦截方法:

return true:对当前事件进行拦截,交给本view的onTouchEvent处理

return false:不对事件进行拦截 交给子view的分发事件处理‘;

return 系统默认:交给子view的分发事件处理;

事件响应public boolean onTouchEvent(MotionEvent ev)

return true: 不再向上传递给上一层view的onTouch事件

return false: 返回给上一层view的onTouc事件

return 系统默认:返回给上一层view的onTouch事件

附部分源码:

public class MyViewPager extends android.support.v4.view.ViewPager {
public MyViewPager(Context context) {
super(context);
}
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent arg0) {
return super.onTouchEvent(arg0);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
if (arg0.getY() < 300 && this.getCurrentItem() == 0 ) {
return false;
}
return super.onInterceptTouchEvent(arg0);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值