ItemTouchHelper:防止越界拖动

2024-01-28

我有一个带有 ItemTouchHelper 的回收器视图。 它允许拖动项目。

我想将拖动限制在回收器视图的边界内 - 即,您不能只将视图拖动到容器之外,从而使其消失。

我尝试像这样检查绝对坐标:

 @Override
    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        recyclerView.getLocationOnScreen(pos);
        int rvY = pos[1];
        viewHolder.itemView.getLocationOnScreen(pos);
        int vhY = pos[1];


        if (rvY > vhY || rvY + recyclerView.getHeight() < vhY + viewHolder.itemView.getHeight()) {
            return;
        }
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
...
}

但随后我遇到了某种渲染并发问题 - 如果我缓慢移动视图,它在超出范围时会停止移动,但如果我移动得更快 - 那么它无论如何都会离开 recyclerview 边界。

有什么想法/方法吗?


dY 和 dX 值必须剪裁到RecyclerView的界限:

override fun onChildDraw(c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dX: Float, dY: Float, actionState: Int, isCurrentlyActive: Boolean) {
    val clippedDx  = clip(recyclerView.width, viewHolder.itemView.left, viewHolder.itemView.right, dX)
    val clippedDy  = clip(recyclerView.height, viewHolder.itemView.top, viewHolder.itemView.bottom, dY)
    super.onChildDraw(c, recyclerView, viewHolder, clippedDx, clippedDy, actionState, isCurrentlyActive)
}

private fun clip(size: Int, start: Int, end: Int, delta: Float): Float {
    val newStart = start + delta
    val newEnd = end + delta

    val oobStart = 0 - newStart
    val oobEnd = newEnd - size

    return when {
        oobStart > 0 -> delta + oobStart
        oobEnd > 0 -> delta - oobEnd
        else -> delta
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ItemTouchHelper:防止越界拖动 的相关文章

  • 致命异常:Google 地图 V2 中的 GLThread、StackOverflowError

    我正在实施 Google 地图 V2 并利用从外部 GPX 文件接收的交付路线 设备路径 设备当前位置和交付点位置 问题是它大多数时候都有效 我收到的错误 当它不起作用时 是下一个 03 16 20 48 37 811 I dalvikvm
  • 从 admob 独立 SDK 切换到 Google Play 服务 SDK 时,apk 大小会膨胀

    使用 Admob SDK 我的 apk 大小为 230Kb 当用 google play services SDK 替换 Admob SDK 时 它是 1 5MB 膨胀了 6 倍以上 我想完整的 Google Play 服务客户端 SDK
  • 在运行时绘制HSV圆

    我想在我的应用程序中有一个颜色选择器 如下所示 我尝试过逐像素填充位图 尝试使用画布drawArc 方法 这两种方式都不利于性能 有任何想法吗 它可能不完全是它应该的样子 与颜色 饱和度等有关 但是这是一些东西 http i1272 pho
  • 无法禁用 Firestore 中的离线数据

    从我的数据中删除数据后Firestore Database 这需要我的Android app一段时间后才意识到数据已被删除 我认为这是由于自动数据缓存而发生的 我的应用程序与离线使用无关 我想禁用此功能 我已将其添加到我的自定义中Appli
  • 收到“提供的 API 密钥已过期”。使用 Places API 时出错

    我已经从 Google 控制台为 Places API 密钥生成了服务器密钥 但每当我访问该服务时 我都会收到 提供的 API 密钥已过期 错误 我已尝试重新生成密钥 但仍然出现相同的错误 我遇到了同样的问题 但终于解决了 Google 地
  • 意图过滤器到底是什么?

    我读过很多关于意图过滤器的文章 但我真的无法理解它们到底是做什么的 那么 如果有人可以用一个清晰 的例子向我解释意图过滤器的作用到底是什么 thanks 我认为这是有据可查的here http developer android com g
  • Android/java:从 ProGuard 过渡/迁移到 R8?

    我想知道如何从ProGuard to R8 我是否应该从 Gradle 文件中删除与 Proguard 相关的行并添加android enableR8 true线代替 Thanks Proguard 由 GuardSquare 开发和维护
  • Android 上 Java 库中的代码出现 NoClassDefFoundError

    我的用户经常遇到错误 应用程序在启动期间崩溃 当应该加载 MainActivity 时 VM 显然找不到该类 我不明白为什么 该应用程序的架构是 我的免费版和专业版都使用一个通用项目 不知道是否相关 请参阅下面的堆栈跟踪 有什么想法吗 ja
  • 按钮上方带有文本的单选按钮

    我是 Android 新手 我需要在我的活动中添加单选按钮 但我需要将文本放在项目符号按钮的顶部 请提供任何帮助 我发现了以下内容 尽管我不明白 drawable in 选择器和 style Tab 样式是什么 顶部带有文本的单选按钮 ht
  • 不同风格的模块文件

    我正在尝试在同一个应用程序中实现播放服务和华为服务 但希望能够按风格配置使用哪一个 每种风格都使用自己的 applicationIdSuffix 因此 对于每种不同的风格 华为插件都会失败 我无法编译 我的应用程序模块包含agconnect
  • 带有内容提供商的小部件;无法使用ReadPermission?

    所以我刚刚为我的应用程序实现了一个小部件 它通过我的数据库从数据库获取数据ContentProvider 我在清单中定义了自己的读 写权限 声明我使用它们 似乎没有什么区别 并在内容提供程序中要求它们
  • 如何将您的终端与 Android 模拟器连接

    我尝试导航到 android 工具文件夹并输入 adb shell 命令 但它似乎不起作用 我的终端似乎只能识别命令的 adb 部分 并给我一条错误消息 我究竟做错了什么 通过键入列出所有连接的设备adb devices 检查是否列出了任何
  • toArray 与预先确定大小的数组

    使用时ar toArray new String ar size 安卓工作室3 2 1警告预先确定大小的数组并建议空数组 有两种方式将集合转换为数组 使用 预先确定大小的数组 如 c toArray new String c size 或使
  • 错误:类 kotlin.reflect.jvm.internal.FunctionCaller$FieldSetter

    我已尝试一切方法来消除此错误 但它不断出现 Class kotlin reflect jvm internal FunctionCaller FieldSetter can not access a member of class com
  • 无法在 Android Studio 中运行项目

    当我尝试在 Android Studio 中运行我的项目时 我收到以下错误消息 Execution failed for task CricHQ dexDebug gt com android ide common internal Log
  • Android Studio错误的含义:未注释的参数覆盖@NonNull参数

    我正在尝试 Android Studio 创建新项目并添加默认值后onSaveInstanceState方法创建 MyActivity 类 当我尝试将代码提交到 Git 时 我收到一个我不明白的奇怪错误 代码是这样的 我得到的错误是这样的
  • 安卓独立包

    我有一个很大的 UI 大约 20 25 个屏幕 我应该如何组织我的代码 我应该按功能分成不同的包吗 我是否应该为所有 UI 类创建一个包 然后创建子包进行组织 或者我不应该创建单独的包并组织到文件夹中 任何帮助将不胜感激 当您创建文件夹时
  • 使用Android Camera API,拍摄照片的方向始终未定义

    我使用相机API 拍摄的照片总是旋转90度 我想旋转它 所以首先我想知道图片的方向 这一点我被卡住了 我总是以两种方式得到未定义的方向 这是代码 Override public void onPictureTaken byte data C
  • 如何以相同的意图从相机获取全尺寸图片和缩略图

    我一直需要找到这个问题的解决方案 我已经从这个社区搜索并测试了许多解决方案 但任何人都适合帮助我 我有两个活动 第一个活动拍摄一张照片并将其发送到另一个活动 该活动有一个 ImageView 来接收该照片 直到这里我遇到问题 以及一个在数据
  • Android:在surfaceview上实现admob

    我有一个使用 SurfaceView 的小游戏形式的活动 下面是代码片段 我很困惑如何在 SurfaceView 上实现 admob 请建议 public class DroidzActivity extends Activity priv

随机推荐

  • 如何将形状为 64x4x4x3 的张量的形状更改为与网络输入相同的另一个形状?

    我正在尝试将 jpeg 压缩实现为 keras 中的噪声层 在我的实现过程中 我需要改变形状 我很困惑如何才能做到这一点 所以我尝试解释我做了什么以及我想做什么 首先 在下面的函数中 我生成了 8x8 块的所有 DCT 系数 该块生成形状为
  • Flask-SQLAlchemy数据库引擎返回表名,但元数据中的表键为空

    我已连接到 MS SQL Server 以下返回数据库中的所有表名 app config from object config db SQLAlchemy app db engine table names 然而 这并不 db metada
  • 直接通道使用与使用代理?

    正如标题所暗示的 我试图理解为什么在 WCF 中有时人们选择 生成代理 而不是使用 ChannelFactory 手动创建新的通道实例 我已经看过每一种的例子 但还没有真正找到任何解释为什么你会选择其中一种 老实说 我只与渠道合作过Chan
  • 响应式网站图像问题

    如果你看一下该网站 http cornerstonecastings com http cornerstonecastings com 这是我的第一个响应式网站 它是用 Wordpress 构建的 我遇到的问题是网站上图像的响应能力 如果您
  • DRF ListSerializer 和 ListField

    我在我的项目中使用 django rest 到目前为止我使用的对象列表列表序列化器 http www django rest framework org api guide serializers listserializer 当我需要列表
  • 将眼动追踪 .edf 文件转换为 ASC/CSV 格式

    我有 edf 格式的跟踪数据记录 SR RESEARCH eyelink 我想在 python 中将其转换为 ASC CSV 格式 我有 GUI 应用程序 但我想以编程方式 在 Python 中 进行操作 我找到了 pyEDFlib 包 但
  • 变量声明与变量绑定相同吗?

    MDN 文档 https developer mozilla org en US docs Web JavaScript Reference Statements let状态 let 绑定是在包含的 块 范围的顶部创建的 该声明通常称为 吊
  • Matlab - 加速嵌套 For 循环

    一个简单的问题 但我不太擅长 MATLAB 我有向量x n 1 y 米 1 和w x y 我想定义M n m x 1 as M i x 中小于或等于 w i 的元素数量 w 已排序 这只是没有削减它 N n m M zeros N 1 fo
  • ARMv8 AArch32模式是否向后兼容armv4、armv5或armv6?

    众所周知 ARMv8 AArch32 位模式完全向后兼容 ARMv7 架构 并且ARMv7向后兼容ARMv4 ARMv5te和ARMv6 从上面的说法 我们可以说ARMv8 AArch32模式也向下兼容ARMv4 ARMv5te和ARMv6
  • 如何手动打开休眠会话?

    我有一个相当大的项目 涉及 spring 和 hibernate 现在 我正在将某些对象从休眠状态恢复到内存中 但我遇到了一些障碍 我有以下设置 A 类包含多个基元和一个 B 类 B 包含基元和一个 C 类 以前是惰性加载 现在我有这个 服
  • 如何阻止嵌套列表与父列表重叠?

    看这里 http jsfiddle net wHztz 67 http jsfiddle net wHztz 67 在此示例中 颜色是背景图像的占位符 我注意到当嵌套列表停止重叠时display block被移除自 innerLeft ul
  • 部署后 ASP.NET 网站看起来有所不同

    我已经用谷歌搜索了这个问题的答案 但还没有找到任何答案 也许我使用的搜索词太通用了 无论如何 这里是 我发现了网页设计和 ASP NET 的乐趣 也发现了尝试在 IE 和所有其他浏览器中以相同方式显示内容的噩梦 我正在 VS2010 中工作
  • 使用R语言进行冒泡排序?

    我是编程新手 刚刚开始学习R语言 我正在尝试进行冒泡排序 但它显示以下错误消息 谁能帮我解决这个问题吗 x lt sample 1 100 10 n lt length x example lt function x for i in 1
  • 如何只显示 1 条得分最低的记录?

    我只想显示 DL 列表中的 1 条记录 该记录具有所有 DL 中的最低分数 目前它正在显示所有记录 在 stackblitz 的示例中 您可以看到第一条记录的 DL 分数为 54 20 并已更新 我不想显示所有 3 条记录 而是只想显示 1
  • 缺少 Idlj 编译器 (Linux/JDK 11)

    找不到idlj编译工具 idl文件 已检查 usr bin and usr lib jvm java 11 jdk 它不是和JDK捆绑在一起的吗 如何添加idlj编译器 附 我更喜欢Python 不太使用Java 如果这是一个愚蠢的问题 我
  • 从 facebookomniauth 获取名字和姓氏字段

    我现在正在我的应用程序中实现omniauth 功能 一切正常 除了我无法从 Facebook 上获取名字和姓氏 这是我的模型代码 def self from omniauth auth user User where email auth
  • 在 Python 3 中未显式打开文件时处理从字节到字符串的转换

    我使用 Requests 模块进行授权 然后从 Web API 中提取 csv 内容 并使其在 Python 2 7 中正常运行 我现在想在 Python 3 5 中编写相同的脚本 但遇到一些问题 iterator should retur
  • 使用注释来注入依赖项是否会消除依赖项注入(外部配置)的主要好处?

    我正在使用 Spring 这是一个控制器 Controller public class PersonController Resource name PersonService private PersonService personSe
  • 如何以编程方式获得 Scenekit 关卡编辑器的优势

    我刚刚运行了一些测试 比较了加载 创建场景的不同方式的性能 以了解性能影响 该测试只是渲染一个 32x32 的立方体网格 并观察 CPU 使用率 内存 能源和渲染时间 不是很科学 但有一些明确的结果 这四项测试包括 Load a dae e
  • ItemTouchHelper:防止越界拖动

    我有一个带有 ItemTouchHelper 的回收器视图 它允许拖动项目 我想将拖动限制在回收器视图的边界内 即 您不能只将视图拖动到容器之外 从而使其消失 我尝试像这样检查绝对坐标 Override public void onChil