事件的分发传递机制

Activity–>ViewGroup–>view
当我们点击一个Button的时候,事件其实是从Activity–>Layout–>button进行传递的,在传递的过程中可以对事件进行拦截、分发和消费。
默认返回值super是一种隧道回传机制,对事件不进行拦截
返回值是true表示当前view自己消费掉
返回值是false表示当前view不消费,回传到上一级

public class MyLinearLayout extends LinearLayout {
    public MyLinearLayout(Context context) {
        super(context);
    }
    
    public MyLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        System.out.println("MyLinearLayout.dispatchTouchEvent");
        return super.dispatchTouchEvent(ev);
    }
    
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        System.out.println("MyLinearLayout.onInterceptTouchEvent");
        return true;
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        System.out.println("MyLinearLayout.onTouchEvent");
        return super.onTouchEvent(event);
    }
}

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

实战演练:
集成百度地图后,需要对标记Marker的位置进行点击调转到百度地图导航,结果点击事件就是不好用
经核实:
事件被MapView给消费掉了
解决:
在MapView的外层套一层布局,在父布局进行事件拦截

public class MyLL extends LinearLayout {
    public MyLL(Context context) {
        super(context);
    }

    public MyLL(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public MyLL(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return true;
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值