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中触摸事件详解
相关推荐
CV资深专家1 分钟前
Android 相机框架的跨进程通信架构
android
前行的小黑炭23 分钟前
Android :如何提升代码的扩展性,方便复制到其他项目不会粘合太多逻辑,增强你的实战经验。
android·java·kotlin
2501_9159214324 分钟前
前端开发工具有哪些?常用前端开发工具、前端调试工具、前端构建工具与效率提升工具对比与最佳实践
android·前端·ios·小程序·uni-app·iphone·webview
花菜会噎住1 小时前
MySQL 高级特性与性能优化:深入理解函数、视图、存储过程、触发器
android·mysql·函数·索引·视图
娅娅梨6 小时前
Android- Surface, SurfaceView, TextureView, SurfaceTexture 原理图解
android·surface
2501_915918418 小时前
HTTPS 端口号详解 443 端口作用、iOS 抓包方法、常见 HTTPS 抓包工具与网络调试实践
android·网络·ios·小程序·https·uni-app·iphone
程序员码歌8 小时前
明年35岁了,如何破局?说说心里话
android·前端·后端
非门由也10 小时前
Android studio安装教程——超详细(含安装包安装教程)
android·ide·android studio
平淡风云10 小时前
Android应用添加日历提醒功能
android·日历
骐骥111 小时前
2025-09-08升级问题记录:app提示“此应用专为旧版Android打造..”或“此应用与最新版 Android 不兼容”
android·升级·不兼容·target sdk·专为旧版 android 系统