同时检测父视图和子视图的 Android-Touch 事件

2024-02-01

目前以下是我的应用程序的布局:

       LinearLayout
            ----Button
               ----ScrollView
                  ----RelativeLayout
                     ----EditText

我在所有这些之上创建了一个透明的 LinearLayout,实现了 OnTouchListener 并在 OnTouch() 内部,返回 false。因此,所有控件都移动到子级下方。但是在 LinearLayout 上,我无法处理 ACTION_MOVE 操作,因为此布局不消耗 MotionEvent 对象。有什么方法可以检测父视图和子视图中的所有触摸事件吗?


在我的经验中,dispatchTouchEvent()方法不应该被重写,因为它很难控制。我的建议是onInterceptTouchEvent()方法。 Android 不支持覆盖此选项。您可以通过创建自己的视图来劫持它,下面是从relativelayout扩展的代码片段:

public class InterceptTouchRelativeLayout extends RelativeLayout{

public interface OnInterceptTouchListener{
    boolean onInterceptTouch(MotionEvent ev);
}

private OnInterceptTouchListener onInterceptTouchListener;

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

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

public InterceptTouchRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return onInterceptTouchListener.onInterceptTouch(ev);
}

public void setOnInterceptTouchListener(OnInterceptTouchListener onInterceptTouchListener) {
    this.onInterceptTouchListener = onInterceptTouchListener;
}

}

并像往常一样使用它,

myView.setOnInterceptTouchListener(new InterceptTouchRelativeLayout.OnInterceptTouchListener() {
        @Override
        public boolean onInterceptTouch(MotionEvent ev) {
            switch (ev.getAction()){
                case MotionEvent.ACTION_DOWN:
                    // Parent didn't steal this touch event if return false this case.
                    return false;

                case MotionEvent.ACTION_MOVE:
                    // Parent didn't steal this touch event if return false this case.
                    return false;

                case MotionEvent.ACTION_UP:
                    // Parent didn't steal this touch event if return false this case. However, please notice, it's too late for the parent to steal this touch event at this time, it won't work anymore.
                    return true;
            }

            return false;
        }
    });

无论如何,我的建议是更多地研究视图/视图组控制触摸事件的流程。这是一个解释onInterceptTouchEvent()会为您的目的而工作:

  • 当触摸父级的子级所在位置时,onInterceptTouchEvent()将会被调用,如果我们在 ACTION_DOWN 处返回 false,则会认为父级尚未窃取此触摸事件,并检查其子级是否已实现onTouch()。这样,只要孩子不叫requestDisallowInterceptTouchEvent(true),父母仍然可以处理这个触摸事件onInterceptTouchEvent()并且孩子可以自己处理相同的触摸事件onTouch() event。但是,有时您需要考虑处理onTouch()父母的事件,如果没有孩子处理触摸事件,那么父母可以处理它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

同时检测父视图和子视图的 Android-Touch 事件 的相关文章

  • Android-ListView-performItemClick

    当我尝试使用时遇到一些困难执行项目单击ListView 的功能 我想要做的就是以编程方式在列表的第一项中执行单击 我怎样才能做到这一点 我在文档中查找了该函数 但我并不真正理解它的参数 我尝试过类似的事情 myListView perfor
  • Android - 手机锁定时执行操作

    我想知道如何在手机锁定时执行某些操作 或继续侦听传感器或电池更换事件 当手机锁定时 它会停止监听传感器的变化 我尝试过使用唤醒锁 但它不起作用 也许我使用错误 任何帮助 将不胜感激 我建议为此使用服务 即使手机被锁定 它们也会在后台运行 这
  • 在运行时绘制HSV圆

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

    从我的数据中删除数据后Firestore Database 这需要我的Android app一段时间后才意识到数据已被删除 我认为这是由于自动数据缓存而发生的 我的应用程序与离线使用无关 我想禁用此功能 我已将其添加到我的自定义中Appli
  • 在 Android 中从互联网链接获取数据

    我正在制作一个带有 URL 的应用程序 asp 扩展名 我们向其传递所需的参数并使用 POST 方法获取一些字符串结果 关于如何实现这一目标有什么建议吗 UPDATED 实际上我有一个 net 链接 它接受一些 POST 参数并给我一个结果
  • 强制关闭导致HTTP实体可能不为空

    这里是发送数据 Http 的完整代码 asynctask private class MyAsyncTaskPupuk extends AsyncTask
  • 在 Android 上检测已接听的拨出电话

    我知道这个问题已经被问过很多次了 但没有答案 但我仍然希望有人终于解决了这个问题 问题 我有一台运行 Android 2 3 的未 root 设备 我需要创建一项服务 打电话 等待呼叫被应答 接听电话后挂断电话 有超时 和其他许多人一样 我
  • 读取 Android 4.2 中的 APN?

    我有个问题阅读 APN在安卓v4 2中 是读 不是写APNS 它抛出一个安全异常 没有写入 APN 设置的权限 用户 10068 和当前用户都没有权限 进程有 android permission WRITE APN SETTINGS 相同
  • 在Android中打开浮动菜单(上下文菜单)?

    我创建了一个新菜单 名为 drmenu xml 当我按下菜单按钮时它可以正常工作 但是当用户按下按钮时我需要打开上下文菜单 下面的代码按钮只显示一个吐司 这是我的 xml 布局
  • Android异步服务调用策略

    这是场景 客户端对服务进行远程调用 返回 void 并提供 回调对象 服务在后台线程上执行一些长时间运行的逻辑 然后使用回调对象来触发以太成功或失败 因为这些操作视觉元素 执行 Activity runOnUiThread 块 该场景运行良
  • android studio更新到3.0后任务执行失败

    当我更新 Android Studio 3 0 时 出现错误 unable to merge with dex 然后我添加了mutiDexEnabled true并且还添加了com android support multidex 1 0
  • Android 和 iOS 中的应用程序文件大小差异

    通过使用两个应用程序分发服务 Android 市场和 Apple 应用程序商店 我发现了一个谜团 Apple 应用程序的文件大小通常大于 Android 应用程序 我似乎找不到任何对这些差异的解释 而且这似乎是一个未触及的主题 我尝试过分配
  • Android:NotificationCompat.MediaStyle 操作按钮不执行任何操作

    我有一个简单的 Android 应用程序 其中包含一个Activity and a Service源自于MediaBrowserServiceCompat 我已成功将其设置为通过使用播放我的主要活动中的音频MediaBrowserCompa
  • Android TabLayout:均匀分布

    我正在查看 Google IO 中使用的 Google 类 称为 SlidingTabLayout 在该类中 有一个名为 setDistributeEvenly 的方法 它允许所有这些选项卡在屏幕上均匀分布 每个选项卡具有相同的大小 中心对
  • 如何更改蜂窝中儿童偏好屏幕的背景颜色

    过去几天我一直在寻找解决方案 但找不到 我需要更改右窗格的背景颜色 我知道如何更改左父首选项的颜色 我在清单文件中创建了一个新主题
  • 调用属于Fragment的Activity的函数

    我正在与多个Fragments在 Android 下 我对如何从嵌入式应用程序发送和接收数据感到困惑 为了简单的解释 我有一个ListFragment and a MapFragment使用解释的方法here https stackover
  • 不幸的是 Project_Name 已停止

    我有一个简单的应用程序 您可以在文本视图中输入文本并按提交 它会在另一个活动中显示文本 然而 当我按下提交时 给我消息 不幸的是 发送已停止 我查看了SO上的其他线程 但是不幸的是 myfirstproject 在 java 中停止工作错误
  • 如何在不下载子项的情况下从 Firebase 获取子项密钥?

    我有一个 Firebase 数据库 其中的节点 items 有很多子项 我想导入子项键的列表 由于每个子项都包含相当多我对此不感兴趣的数据 因此我想仅下载子项密钥 以最大程度地减少传输的数据量 为了便于说明 假设我有以下数据结构 然后我想获
  • 活动构建变体没有测试工件

    我基于 调试 构建变体创建了一个名为 bitrise 的新构建类型 使用 debug 构建变体时 经过检测的 androidTests 构建并运行良好 但是当我切换到新的 bitrise 构建变体时 出现以下错误 Process finis
  • 带有包含布局的导航抽屉布局

    我认为我的问题实际上很简单 但我不知道如何解决 有一个工作导航抽屉 代码如下

随机推荐

  • 如何将逗号和分号分隔的字符串拆分为二维数组

    假设我有一个变量users包含以下文本字符串 其中每个用户用分号分隔 每个用户的每个属性用逗号分隔 Bob 1234 email protected cdn cgi l email protection Mark 5678 email pr
  • 如何在 Ruby 中找到两个 Date 对象之间的天数?

    如何找到两个 Date 对象之间的天数 从结束日期减去开始日期 endDate beginDate
  • 解析 haskell 保留注释/格式

    我想做一些源代码转换 自动导入列表清理 并且我想保留注释和格式 我断断续续地听到过一些关于执行此操作的解析器的内容 我认为是 ghc 解析器 看来我可以通过从文件中提取内容来使用 hs src exts Language Haskell E
  • 库模块中的崩溃报告

    我已经尝试过 crashlytics 但不支持 这是我从他们团队得到的回复 感谢您对此的关注 Crashlytics 或 Fabric 的任何部分都不能包含在分发给外部应用程序的任何 SDK 中 正如您提到的 这将导致 SDK 和应用程序发
  • 查看运行“sbt”中“.sbtopts”中的选项

    根据这有帮助post https stackoverflow com a 14561346 409976 我删除了我的 sbtconfig 并添加了 sbtopts cd myProject cat sbtopts J Xmx4G J XX
  • 如何将 UIImage 转换为 BMP 并另存为数据(不是 JPG 或 PNG)

    我正在我的 iOS 应用程序 Swift 3 和仅支持 BMP 格式的应用程序 在 MS Windows 上 之间同步 BMP 图像 在 MS Windows 应用程序上创建的 BMP 图像作为 base64 字符串下载 另存为Data并使
  • 当源中存在其他静态文件时,为什么我无法在 django 项目中添加静态文件?

    我正在尝试为 Heroku 构建一个 Django 应用程序 并且已经完成了民意调查教程并且Heroku 文档 https devcenter heroku com articles django assets 当使用基本的 Django
  • Weld/CDI 的最佳调试技巧是什么?

    Java EE 6 的优点之一是新的依赖项注入框架 具有 Weld 参考实现的 CDI 它促使我们开始以与实现无关的方式内部迁移到 JSR 330 其明确目标是能够拥有核心 jar 被冻结 然后能够添加额外的 jar 提供新的模块来替换核心
  • 删除未使用的 HTTP 处理程序以提高性能和安全性

    在哪里可以获得所有默认 IIS HTTP 处理程序的功能列表 我需要文档 我读过一些博客 出于性能和安全原因 建议删除数十个未使用的 HTTP 处理程序 例如 建议删除 TraceHandler Integrated 和 TraceHand
  • 取消使用 Hangfire.io 计划的正在运行的作业

    我使用hangfire io 库安排作业 我可以观察它在内置仪表板中的处理情况 但是 我的系统要求可以从仪表板取消该作业 有一个选项可以删除正在运行的作业 但这只会更改数据库中作业的状态 并不会停止正在运行的作业 我在文档中看到有可以通过的
  • 如何从经验分布函数中制作样本

    我正在尝试在 Python 上实现非参数引导 它需要获取一个样本 从中构建一个经验分布函数 然后从该 edf 生成一堆样本 我该怎么做 在 scipy 中 如果您知道描述它的确切公式 我只能找到如何创建自己的分布函数 但我只有一个 edf
  • 解释为什么 Array.sort 这样做

    当我们尝试对数字数组进行排序时 人们说使用这个 var numbers 4 2 5 1 3 numbers sort function a b debugger return a gt b 1 1 debugger print number
  • 在SAS中使用循环重命名索引列?

    我有一个数据集 其中变量为 col1 col2 col3 col15 我想将它们重命名为new1 new2 new3 new 15 我可以写15次类似的rename col1 new1 在 SAS 中 但如何使用循环实现此目的 谢谢 首先
  • pip install MySQL-python 返回无法找到 vcvarsall.bat

    我一直在努力pip install MySQL python在 Windows 7 上但它返回unable to find vcvarsall bat 我正在使用Python 3 4 我怎样才能以简单的方式完成这项工作 而无需经历安装 Vi
  • Android 如何查看版本

    我在 2 2 环境中完成了我的应用程序 当我在旧版本中安装我的 apk 时 我收到解析器错误 是否有可能显示我们自己的消息而不是解析器错误消息 据我看来 事实并非如此 做这样的事情 private int GetVersion int ve
  • 如何获取 std::thread() 的 Linux 线程 ID

    我正在玩std thread我想知道如何获得新的线程IDstd thread 我不是在谈论std thread id而是给予线程的操作系统 ID 您可以使用pstree 这仅供我所知 并且仅针对 Linux 平台 不需要可移植 我可以像这样
  • 阻止 jQuery 重复,示例已附

    我必须将 jQuery 附加到发票上 有时我必须批量打印多张发票 当这种情况发生时 我的每张发票都会出现完全相同的 jQuery 并且每次创建我不需要的额外元素时它都会运行 有没有办法让出现多次的 jQuery 仅在它最后一次出现在代码中时
  • 使用 SQL 查询查找最接近的匹配字符串及其子字符串

    我想编写一个查询 它将按顺序获取给定字符串及其子字符串的最接近的匹配字符串 例如 假设我有一列中包含所有名称的表 如果我想搜索名字 ATUL 那么结果应该首先列出所有匹配的不同名称 ATUL then ATU then AT 进而 A 最后
  • href 中的内联 JavaScript

    你怎么能做这样的事情 a href myLink a 并在单击链接时执行 href 中的 js 直接把JS代码放进去就可以了 a href fsljk a 不过 您不应该执行内联脚本 您应该不引人注目地附加事件处理程序 a href bla
  • 同时检测父视图和子视图的 Android-Touch 事件

    目前以下是我的应用程序的布局 LinearLayout Button ScrollView RelativeLayout EditText 我在所有这些之上创建了一个透明的 LinearLayout 实现了 OnTouchListener