Android中Touch事件分发机制-关于dispatchTouchEvent等方法的研究

本文详细探讨了Android中从Activity到ViewGroup再到View的Touch事件分发机制,包括dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent的使用,通过实例分析了各种情况下的事件处理流程,如默认行为、取消分发、拦截和消费事件等。
摘要由CSDN通过智能技术生成

一、相关事件

1.与Activity相关的事件:dispatchTouchEvent(分发事件)、onTouchEvent(触摸事件)
2.与ViewGroup相关的事件:dispatchTouchEvent(分发事件)、onInterceptTouchEvent(拦截事件)、onTouchEvent(触摸事件)
3.与View相关的事件:dispatchTouchEvent(分发事件)、onTouchEvent(触摸事件)


二、事件简介

1.dispatchTouchEvent:分发事件,默认返回false。false即表示继续向下分发事件,true则表示停止分发事件。
2.onInterceptTouchEvent:拦截事件,默认返回false。false表示不拦截事件,true表示拦截事件并交由自身的onTouchEvent进行处理。
3.onTouchEvent:触摸事件,默认返回false。false表示没有消费此次Touch事件,true则表示此次Touch事件被消费了。


三、研究用例

1.以下图为例进行分析,其中A、B、C都是RelativeLayout,Button-B是B层的Button,C层有一个Button和一个TextView。
这里写图片描述
2.为了能打印出各个方法何时执行的日志,我让A、B、C继承了RelativeLayout并重写了dispatchTouchEvent(分发事件)、onInterceptTouchEvent(拦截事件)、onTouchEvent(触摸事件)方法,如下(A、B、C相似):

package com.katherine.point;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.RelativeLayout;

public class A extends RelativeLayout {
   

    public A(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public A(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public A(Context context) {
        super(context);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        System.out.println("A-----dispatchTouchEvent");
        return super.dispatchTouchEvent(ev);
        // return true;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        System.out.println("A-----onInterceptTouchEvent");
        return super.onInterceptTouchEvent(ev);
        // return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        System.out.println("A-----onTouchEvent");
        return super.onTouchEvent(event);
        // return true;
    }

}

Button-B、Button-C继承了Button类:

package com.katherine.point;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Button;

public class ButtonOfBfloor extends Button {
   
    public ButtonOfBfloor(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public ButtonOfBfloor(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ButtonOfBfloor(Context context) {
        super
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值