Android RecycleView触摸事件记录

文章目录

一、前言

在开发中有时候需要对RecycleView的触摸事件进行拦截和处理,RecyclView本身事件比较复杂,直接使用View的事件体系不能完成特定业务。比如区分滑动和点击事件。

二、onFilterTouchEventForSecurity

该事件属于一个系统比较底层的事件。需要继承RecycleView才能处理。

在阿里的通义灵码上面对该函数的解释如下:

onFilterTouchEventForSecurity() 是一个在Android框架内部使用的保护方法,主要存在于View类中。这个方法并不经常直接由开发者调用,而是系统自动调用它来确保触摸事件的安全性,特别是在处理来自不同安全上下文的输入事件时。

方法作用:

此方法用于过滤(或验证)触摸事件,以确定它们是否源自安全的来源,特别是当应用程序运行在多窗口环境或者有权限限制的情况下。它检查触摸事件的来源,确保这些事件来自于可信任的应用程序或界面,防止恶意应用伪造输入事件来操控其他应用。

默认行为:

默认情况下,onFilterTouchEventForSecurity()方法会检查触摸事件的标志,确保事件标记为FLAG_WINDOW_IS_OBSCURED或FLAG_TRUSTED_TOUCH之一。如果事件不符合安全标准,该方法将返回false,表示事件应被丢弃。反之,如果事件来源可信,则返回true,允许事件继续传递给应用的触摸事件处理链。

开发者角度:

通常,开发者不需要直接调用或重写这个方法,因为Android系统已经妥善处理了安全检查。但是,对于那些需要深入了解或定制触摸事件处理流程的高级应用场景,了解这个方法的作用是有帮助的。

注意:

除非你在开发系统级组件或有特殊安全需求的应用,否则直接修改或依赖这个方法的行为可能不是常规做法。

安全性和输入验证是Android系统设计的重要部分,确保遵循最佳实践,避免自行绕过这类安全检查,以免引入安全漏洞。

由于这是一个较底层的框架内部逻辑,大部分应用开发过程中不会直接接触到这个方法,更多关注于如何处理onTouchEvent()、setOnClickListener()等高层级的触摸事件响应即可。

示例代码如下:

java 复制代码
public class MyRecyclerView extends RecyclerView {
  @Override
    public boolean onFilterTouchEventForSecurity(MotionEvent event) {
//        Log.e("YM-->", "onFilterTouchEventForSecurity---->坐标x:" + event.getX() + "--->坐标y:" + event.getY());
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            downEvent = event;
        }
        if (event.getAction() == MotionEvent.ACTION_UP) {
            if (downEvent != null) {
                float x = event.getX() - downEvent.getX();
                float y = event.getY() - downEvent.getY();
                if (Math.abs(x) < 10 && Math.abs(y) < 10) {
                    if (mRecyclerViewClickListener != null) {
                        return mRecyclerViewClickListener.onClick(event);
                    }
                }
            }
            downEvent = null;
        }
        return super.onFilterTouchEventForSecurity(event);
    }
}
  private RecyclerViewClickListener mRecyclerViewClickListener;

    public void setRecyclerViewClickListener(RecyclerViewClickListener listener) {
        mRecyclerViewClickListener = listener;
    }
interface RecyclerViewClickListener {
    //返回false表示不再继续执行后续事件,true表示执行后续事件
    boolean onClick(MotionEvent event);
}

三、addOnItemTouchListener

以下解释源自阿里的通义灵码

在Android中,RecyclerView.addOnItemTouchListener()方法用于给RecyclerView添加一个全局的触摸事件监听器,这个监听器能够捕获发生在RecyclerView上的所有触摸事件,包括那些没有被子View(如单独的列表项)消费的事件。这对于想要监听整个RecyclerView的点击、长按或者其他手势事件非常有用,而不仅仅是单个列表项的事件。

示例代码如下:

kotlin 复制代码
	class MyTouchListener implements RecyclerView.OnItemTouchListener {
    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        // 在这里根据MotionEvent判断是否需要拦截触摸事件
        // 返回true表示事件被拦截,RecyclerView及其子View不再接收此事件
        // 返回false则事件继续向下传递
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
        // 这里处理你想要响应的触摸事件
    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
        // 这个方法用于子View请求RecyclerView不要拦截触摸事件
    }
}

四、参考链接

  1. Android 触摸事件机制ViewGroup中触摸事件详解
相关推荐
AFinalStone12 小时前
Android 7系统异常问题排查(四)Framework层(上)—System Server Watchdog
android·系统异常
宝杰X714 小时前
Android Room3 多平台数据库
android·数据库
huibin14785236917 小时前
热缓解学习记录
android·学习
小田的博客19 小时前
SAP MM 供应商银行主数据更新报错!message R1228!
android·java·服务器
一笑的小酒馆21 小时前
Android智能猫砂盆视频加载慢卡顿问题分析
android
只会cv的小前端1 天前
七巧低代码服务端脚本使用方法
android·低代码·rxjava
1 天前
Android 自定义 View 实战:从零打造工业级全向摇杆控件(OmniJoystickView)
android·kotlin·自定义view·摇杆控件
雨白1 天前
深入理解 Kotlin 协程 (十一):以逸待劳,探秘 select 多路复用与并发安全策略
android·kotlin
hunterandroid1 天前
[Android 从零到一] Android 深度链接与 App Links:从 URI Scheme 到可验证的应用跳转
android
我命由我123451 天前
Jetpack Compose - Material Design 断点范围、WindowSizeClass、针对不同屏幕尺寸创建预览、四类导航栏
android·java·开发语言·java-ee·kotlin·android jetpack·android runtime