【问题标题】:Detect fling gesture over clickable items检测可点击项目上的投掷手势
【发布时间】:2012-02-29 04:36:46
【问题描述】:

想象一个有 4 个按钮的布局

 _______________________________
|              |                |
|      A       |       B        |
|______________|________________|
|              |                |
|      C       |       D        |
|______________|________________|

我想检测整个布局上的投掷手势,但是当从按钮开始投掷时没有检测到。

我正在使用:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    gesturedetector= new GestureDetector(this, this);

    findViewById(R.id.touchContainer).setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.e("","TouchEvent");
            return gesturedetector.onTouchEvent(event);
        }
    });
}

当没有可点击的项目时它会失败,但如果从可点击的项目开始,则会失败。

我该如何解决?为完整的工作答案提供 50 分的赏金

【问题讨论】:

  • Will give 50 point as reward to a complete working answer 被称为“提供赏金”,这是 StackExchange 网站长期实施的概念。请参阅此常见问题解答部分:stackoverflow.com/faq#bounty
  • 哈哈。只是你肯定需要在这个问题上设置一个赏金,你可能希望最高提供超过 50 个代表。为什么?我认为答案很可能是跨多个控件工作的自定义滑动检测器......
  • 该页面显示“2 天内有资格获得赏金的问题”,所以我会尽快打开赏金并将其分配给答案。当然,如果没有一个简单的答案,我会付出更多,没有问题
  • 其实,我有一个想法……我对 Android UI 不太熟悉,但在其他平台上,我会在按钮上覆盖一个透明面板。该面板将处理所有事件,其中滑动将以一种方式处理,单击将转换为“下方”网格中按钮的按钮按下
  • @Addev:你是怎么解决这个问题的?请分享代码。谢谢

标签: java android android-layout android-resources


【解决方案1】:

我实现此目的的一种方法是覆盖以下方法:

public boolean onInterceptTouchEvent(MotionEvent event){
    super.onInterceptTouchEvent(event);
    ...

你可以在你的布局容器中覆盖这个方法(例如 ViewGroup,或者你拿着按钮的任何东西)并继续从它返回 false 以便“拦截”正在被子 @ 消费的触摸事件987654324@s(即您的按钮)。在这个被覆盖的方法中,您可以使用MotionEvents 调用您的手势检测器对象。此方法还“看到”以ViewGroup 本身为目标的事件,这意味着 - 如果我没记错的话 - 您需要从该方法中调用您的手势检测器,并且这样做手势检测器将“看到”所有事件,无论它们是否在按钮上。因此,如果您从按钮开始拖动手指,然后在布局背景上的某个点结束,手势检测器应该会看到整个滑动。您不需要将来自布局自己的onTouchEvent() 的事件提供给手势检测器,因为它已经看到了它们。

第二种方式:

我刚刚查看了我使用它的项目,并意识到我切换到了另一种方法。我实际上所做的是我设计了我所有的孩子Views,这样父母Activity(或包含ViewGroup)可以向所有这些孩子Views注册相同的手势检测器对象(我的每个特殊的Views 有一个方法叫做registerGestureDetector())。然后,在我的孩子Views 中被覆盖的“onTouchEvent()”中,我将MotionEvents 传递给已向View 注册的手势检测器。换句话说,父 ViewGroup 布局和所有子 Views 只是共享相同的手势检测器。

我意识到这可能听起来有点麻烦,考虑到它可以使用onInterceptTouchEvent() 完成,没有必要,但我的应用程序处理一些非常复杂的规则,这些规则涉及我的Views 需要如何响应触摸事件和手势,它允许我应用一些我需要特定于我的应用程序的额外逻辑。但是,我使用的这两种方法在这里都实现了相同的基本目标:将针对各种Views 的MotionEvents 引导到同一个手势检测器对象。

【讨论】:

  • 非常感谢您的回答,只是测试,但两个答案似乎都有效! =)。尽快给予赏金
  • 假设,splitMotionEvents 如果在父“ViewGroup”上设置为 true,则应该自动启用此功能。但它不会发生。也许是一个错误?文档是模棱两可的,尽管有“可能”这样的措辞,并且没有说明当两个视图同时发生触摸事件时会发生什么(UP和DOWN)
  • 我在我的代码中使用自定义日历,我想使用 fling 滑动日历。但它不适用于带有 onInterceptTouchEvent 的 CalendarView。你能分享你的 onInterceptTouchEvent 代码吗?
  • @Trevor:有使用第一种方法的示例或教程的链接吗?谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 2011-09-05
  • 2010-12-16
相关资源
最近更新 更多