在屏幕上滑动手指激活按钮,就像它们被按下一样

Posted

技术标签:

【中文标题】在屏幕上滑动手指激活按钮,就像它们被按下一样【英文标题】:Sliding finger across screen activating buttons as if they were pressed 【发布时间】:2011-04-08 15:48:28 【问题描述】:

如果我的标题不够清楚,我会详细解释一下:

假设我们有一个充满多个按钮 (10+) 的屏幕,我们按下一个按钮,激活 onTouch/onClick。如果我们现在移动手指而不抬起它,我希望它能够激活它滑过的任何其他按钮。在这种特殊情况下,我希望在您滑过虚拟钢琴时播放声音。

我知道 onTouchListener 解决方案,您可以在其中注册每个 ACTION_MOVE 并找到一些激活新事件的边界,但如果您有多个按钮并希望允许无延迟地平滑滑动,这远非最佳。

我还阅读了this thread,它建议我们将 View 的 touchListener 与 Activity 中的手势侦听器结合起来,但再一次,这对我的情况来说根本不是最佳选择。

我还没有尝试将 touchlistener 与手势监听器结合使用,但如果有人告诉我他们没有其他方法可以这样做,我会继续这样做。

【问题讨论】:

【参考方案1】:

在我看来,这样做的正确方法是忘记按钮,并创建一个自定义视图来绘制整个键盘。在此视图中,您可以按照自己喜欢的方式处理触摸事件。您甚至不需要手势检测器,只需分析运动事件的动作和坐标,非常简单。

我不明白你所说的 ACTION_MOVE 和延迟是什么意思。为了最大限度地减少延迟,对 ACTION_DOWN 做出反应,然后在 ACTION_MOVE 上(如果它在向下状态下悬停其他键)做出反应。它不能比这更快。按钮有一个重要的延迟,因为 onClick() 事件是在用户抬起手指时触发的,在 ACTION_UP 上。

按钮并不像您描述的那样工作。这个想法是,如果用户点击一个按钮,然后同时将他的手指移开,它不会触发周围其他视图的 onClick 事件。这可以防止虚假点击。

【讨论】:

我的意思是检查当前坐标是否在新视图中的延迟(我有点假设这就是该方法的工作原理)。在这个自定义视图中,是否很容易拥有单独的组件? (我在考虑这样一个事实,即我希望 UI 通过在按下/未按下之间切换图像来显示按下了“按钮”)。感谢您的回答! 如果你的意思是比较坐标和关键边界造成的延迟,那么就是epsilon。是的,我认为您可以拥有自定义视图子类 LinearLayout,并在其中放置一些图像视图。然后,您可以使用 ImageView.setImageLevel() 轻松切换单个图像可绘制对象。 听起来很完美。我会继续尝试一下。我会报告,因为我知道有很多人对此感到疑惑(我想我因为我的重复问题而被否决了,但我认为我可以比某些人更好地表达自己)...... 我实际上采取了“简单”的方式,并通过使用 ACTION_DOWN 和 ACTION_MOVE 的 onTouch 方法使用按钮。 onClick 或多或少应该按照您描述的方式工作,但 onTouch 非常适合您能想到的任何奇怪行为:) 顺便说一句,它没有延迟,有 13 个按钮。【参考方案2】:

我实际上采取了“简单”的方式,并使用带有 onTouch 方法的按钮,使用 ACTION_DOWNACTION_MOVE 结合坐标计算,结合 event.getX()event.getY() 允许我检测当前悬停的按钮. 13 个按钮,无延迟。

【讨论】:

能否请您详细说明您是如何使用 onTouch 方法的?我正在尝试实现类似的效果,并且 onTouch 仅识别我触摸的第一个视图,即使我将手指滑过其他视图也是如此。 @Phat7 因为我的按钮填满了显示屏,所以我使用显示尺寸来获取按钮的宽度和高度。然后我使用event.getX()event.getY() 来推断当前悬停的按钮。我从来没有尝试过用实际的按钮检测来做,我只用坐标计算做过。请注意,这种行为可能不应该使用按钮。

以上是关于在屏幕上滑动手指激活按钮,就像它们被按下一样的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用活动中的主页按钮单击 - 就像在锁屏应用程序中一样?

通过滑动手指按下按钮(用于钢琴效果)

通过在多个按钮上滑动手指来选择多个按钮

检测iPad的屏幕何时关闭或Unity中的Home按钮被按下事件?

我需要帮助获得一个使用 arduino 激活有源蜂鸣器的按钮

手指滑动屏幕原理