一起Talk Android吧(第五百二十九回:事件拦截之内部拦截)

本文介绍了Android中View的事件拦截机制,重点讲解了内部拦截的概念和实现方式。通过重写View的onTouchEvent()方法并返回true来拦截特定事件,当事件满足一定条件时阻止父View处理。示例代码展示了一个自定义TextView如何根据触摸点的坐标进行内部拦截。这种方法简便但仅能拦截View自身区域的事件,对于外部拦截将在后续章节讨论。

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


各位看官们大家好,上一回中咱们说的例子是"监听网络状态",本章回介绍的例子是" 事件拦截之内部拦截"。闲话休提,言归正转,让我们一起Talk Android吧!

概念介绍

我们在前面章回中介绍了View中的事件分发机制,不过没有介绍具体的示例,本章回将介绍具体的拦截方法,常用的拦截方法有两种:内部拦截和外部拦截

程序中的画面都是由组件和布局组成的,组件又可以细分为ViewViewGroup。View通常位于ViewGroup中,如果在View中拦截事件就叫作内部拦截,如果在ViewGroup中拦截事件就叫作外部拦截。本章回中先介绍内部拦截方法。

整体思路

在View中重写拦截事件的方法,并且不去调用父View的同类方法。常用的事件方法为onTouchEvent()方法,我们可以在该方法中依据某种条件对事件进行拦截,拦截的方法就是返回true,并且不去调用父View的同类方法。这么做就是告诉父View,我已经对用户的事件做出处理,你不需要再重复处理了。

示例代码

介绍完整体思路后,我们通过文字结合代码的方式来给大家做演示:

public class EventView extends androidx.appcompat.widget.AppCompatTextView {
    private static final String TAG = "EventView";

    //构造方法只列出一个,其它的省略不写
    public EventView(@NonNull Context context) {
        super(context);
    }


    //内部拦截法:返回true同时不去调用父类相同的方法
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        boolean result = false;

        if(event.getRawY() > 1364 && event.getRawY() <1868) {
            result = true;
            return result;
        }
        Log.d(TAG, "onTouchEvent: x = "+event.getRawX()+" y= "+event.getRawY());

        super.onTouchEvent(event);
        return result;
    }
}

在上面的代码中我们自定义了一个TextView的子类,在该类中通过判断Touch事件是否处于某个区间中,如果事件处于该区间那么直接返回true,并且不去调用父类的相同方法;如果事件不处于该区间那么调用父类的相同方法去处理,同时返回false。代码中我们把区间直接写成了数字,它表示屏幕上的某个坐标值,大家可以自行修改数值来限制不同的区间。不过在实际项目中不建议这么操作。

经验总结

内部拦截的优点是实现方便,缺点就是只能拦截位于view自身所在区域的事件,如果想拦截view自身区域以外事件,就需要使用外部拦截,我们在下一章回中介绍。

看官们,关于"事件拦截之内部拦截"的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值