触摸时 ACTION_CANCEL

2024-02-14

我有以下类,它代表一个可触摸的视图并绘制一个滑动条。

public class SlideBar extends View {
private int progress;
private int max;

private Paint background;
private Paint upground;

private RectF bar;

private boolean firstDraw;

public SlideBar(Context context, AttributeSet attrs) {
    super(context, attrs);
    progress = 0;

    upground = new Paint();
    upground.setColor(Color.parseColor("#C2296C"));

    background = new Paint();
    background.setColor(Color.parseColor("#777777"));
}

private void onFirstDraw() {
    max = getWidth();
    bar = new RectF(0, 19, max, 21);
}

public void onDraw(Canvas canvas) {
    if (!firstDraw) {
        onFirstDraw();
        progress = max;
        firstDraw = true;
    }

    canvas.save();
    canvas.drawRoundRect(bar, 5, 5, background);
    canvas.drawCircle(progress, 20, 9, upground);
    canvas.restore();
}

public void setValue(int value) {
    progress = value;
}

public boolean onTouchEvent(MotionEvent evt) {
    System.out.println(evt.getAction());
    progress = (int) evt.getX();
    invalidate();
    return false;
}
}

但是当触摸并拖动它时,我收到一个 ACTION_DOWN,一些 ACTION_MOVE 然后收到一个 ACTION_CANCEL 并且没有进一步的事件。

为什么会出现这样的情况呢?我不想取消该事件并使其继续拖动栏。


当父容器拦截您的触摸事件时,就会发生这种情况。任何覆盖的 ViewGroupViewGroup.onInterceptTouchEvent(MotionEvent) http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent%28android.view.MotionEvent%29可以做到这一点(例如 ScrollView 或 ListView)。

处理这个问题的正确方法是调用ViewParent.requestDisallowInterceptTouchEvent(布尔值) http://developer.android.com/reference/android/view/ViewParent.html#requestDisallowInterceptTouchEvent%28boolean%29一旦您认为需要保留运动事件,请在您的父视图上使用方法。

这是一个简单的示例(attemptClaimDrag 方法取自 android 源代码):

/**
 * Tries to claim the user's drag motion, and requests disallowing any
 * ancestors from stealing events in the drag.
 */
private void attemptClaimDrag() {
    //mParent = getParent();
    if (mParent != null) {
        mParent.requestDisallowInterceptTouchEvent(true);
    }
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        if (iWantToKeepThisEventForMyself(event)) {
            attemptClaimDrag();
        }
        //your logic here
    } else {
        //your logic here
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

触摸时 ACTION_CANCEL 的相关文章

随机推荐

  • 具有不同高度项目的网格布局(React Native)

    Any idea for implementing a grid layout like the following image 答案取决于您要显示的数据 我想这是一个无限列表 向下滚动时会加载更多项目 如果是这种情况 你需要输入 3Lis
  • 流畅的 NHibernate QueryOver 选择不在另一个表中的项目(左连接)

    我有两张桌子 all 编号 丙A 道具B 其他一些专栏 hidden 编号 丙A 道具B 和相应的类 已映射 尚未映射关系 我想从第一个表中获取所有行 减去匹配的任何结果propA or propB财产 我设法通过 Criteria API
  • 重定向 Rails 4 中特定控制器的记录器输出

    我根据上一个问题的答案构建了一个解决方案重定向 Rails 3 中特定控制器的记录器输出 https stackoverflow com q 28821668 56082对于 Rails 3 它工作得很好 但是现在我尝试将相同的基于中间件的
  • buildQueryString 函数的 Purescript 类型

    我是 Purescript 的新手 我正在尝试编写一个函数 可以获取任何记录值并迭代字段和值并构建 一个查询字符串 我在想这样的事情 buildQueryString forall a PropertyTraversible r gt r
  • 复选框操作

    由于某种原因 这段小代码阻止用户检查实际的复选框并将复选标记放入其中 而检查它的唯一方法是单击该行 table tr click function checkBox this children td children input type
  • Cygwin git Push 挂起,msysgit 还好

    我使用代理 而且我对 git 很陌生 而且我使用的是 Windows XP 我已经能够制作一个git push origin master从 msysgit 工作 但无法使用 Cygwin 的 git 在 Cygwin 中工作 我在两个环境
  • 如何在 ASP Dropdownlist 列表项中使用彩色圆圈? (没有 jQuery)

    Goal 我想要一个下拉列表 如果某人的可用性为 True 则显示绿色 如果某人的可用性为 False 则显示红色 注意 我需要在没有 jQuery 的情况下完成此操作 我刚刚被告知我们不允许在我们的项目中使用 jquery 问题 背景 我
  • 允许双 URL 编码的请求路径有效

    我有一个在 IIS 7 0 上运行的标准 ASP Net WebForms 应用程序 带有集成托管管道 我们网站上的许多图像的文件名中都有空格 例如 baseball drawing gif 当我们将这些图像放入 html 页面时 我们对路
  • 使用参数调用事件处理程序[重复]

    这个问题在这里已经有答案了 我正在尝试使用参数调用事件处理程序 它工作得很好 没有争论 我这里哪里出错了 var box box function changeColor a this css background a box click
  • ForeignKey(User, unique=True) 和 OneToOneField 之间的区别[重复]

    这个问题在这里已经有答案了 之间有什么不同models ForeignKey Modelname unique True and models OneToOneField在姜戈 我应该在哪里使用models OneToOneField an
  • TextField maxLength - Android Jetpack Compose

    是否有任何开箱即用的解决方案来限制 TextField 中的字符大小 我没有看到任何像 XML 中那样的 maxLength 参数 您可以使用onValueChange参数限制字符数 var text by remember mutable
  • 左平衡二叉树

    我正在读一本关于数据结构的书 它说左平衡二叉树是一棵树 其中叶子仅占据最后一层的最左边位置 这对我来说似乎有点模糊 这是否意味着叶子仅位于根的左侧并分布在整个级别 或者叶子仅存在于整个树的左侧 究竟什么构成左平衡 我不确定我的猜测是否涵盖了
  • 如何将菜单项添加到 iOS 中的共享菜单

    我刚刚开始进行 iOS 开发 但我必须尽早做的事情是向系统菜单添加一个按钮 就像 Dropbox 在与电子邮件附件交互时添加按钮一样 该应用程序将用于视频 因此在共享菜单上为 QuickTime 播放器添加一个按钮将是理想的选择 我浏览了文
  • 使用 HMAC 或 OpenSSL 进行 URL 签名

    我对 url 签名感兴趣 例如 但我有一些要求 但我还没有解决方案 我将使用PHP or Python对于页面 所以我需要能够使用两者之一来签名和验证签名 我的计划是使用 priv pub 密钥方案来签署一些数据 并能够验证签名是否有效 但
  • 在用户因超时注销之前显示一条消息

    我们有一个使用 Devise 进行身份验证的 Rails 4 应用程序 我们想 在用户会话自动过期前 1 分钟向用户发送消息 让用户单击此消息上的按钮以继续他 她的会话 自动将用户发送到登录页面 并在其会话过期时显示一条消息 是否有任何 D
  • 在图片框中运行另一个应用程序

    这是我用来在图片框中运行另一个应用程序的示例代码 Imports System Diagnostics Imports System Runtime InteropServices Public Class Form1
  • Go 中在 EOF 上重新连接 TCP

    我有以下内容 In an init func if logStashHost lsconn err net Dial tcp logStashHost ToLogStash rec lsconn 然后两个函数 func ReadLogSta
  • 解压内容应用内购买ios

    如果进行应用内购买 Apple 托管的内容将以 zip 格式下载 我尝试解压缩这些内容 但提交使用 zipArchive 打开 zip 文件 ZipArchive za ZipArchive alloc init za delegate s
  • 针对类实现 QProgressBar

    我的 PyQt 程序有 2 个小部件 选择文件等 然后是一个显示解析文件结果的主窗口 该程序非常适合小型样本文件 但是当尝试解析较大的文件时 它会挂起 显示 未响应 然后在大约 30 秒左右后显示结果 我想在主窗口打开之前实现一个 QDia
  • 触摸时 ACTION_CANCEL

    我有以下类 它代表一个可触摸的视图并绘制一个滑动条 public class SlideBar extends View private int progress private int max private Paint backgrou