【问题标题】:Android: Use RealViewSwitcher to switch between views like the home screen doesAndroid:使用 RealViewSwitcher 像主屏幕一样在视图之间切换
【发布时间】:2010-12-15 23:07:50
【问题描述】:

我正在开发一个小型但不错的开源项目:RealViewSwitcher,它允许通过执行水平翻转在多个视图之间切换 - 就像 Android 的 Launcher 一样。这只是一个简单的ViewGroup,它实现了onInterceptTouchEventonTouchEvent 以使事情正常进行。事实上,大部分代码取自文件Workspace.java(第 572 行及以下),处理触摸事件的两种方法也是如此 - 没有太多更改。

但是,我没有让这个东西工作。我目前的工人阶级张贴在这里(在 pastebin 上,因为它非常大): http://pastebin.com/8p8GCEZK

如果我执行我的类(只是创建它,添加一些 TextView,然后将其设置为活动的内容视图),如果我快速抛出,我会得到以下输出:

12-15 23:53:04.797: INFO/RealViewSwitcher(7477): intercept ACTION_DOWN
12-15 23:53:04.797: INFO/RealViewSwitcher(7477): touch ACTION_DOWN
12-15 23:53:04.807: INFO/RealViewSwitcher(7477): touch ACTION_MOVE
12-15 23:53:04.840: INFO/RealViewSwitcher(7477): touch ACTION_MOVE
12-15 23:53:04.867: INFO/RealViewSwitcher(7477): touch ACTION_MOVE
12-15 23:53:04.897: INFO/RealViewSwitcher(7477): touch ACTION_MOVE
12-15 23:53:04.897: INFO/RealViewSwitcher(7477): touch ACTION_UP

我现在的问题是:无论我做什么,我的onInterceptTouchEvent 方法中都没有ACTION_MOVE。我多次阅读文档并尝试使用返回值,但是除了那里的 ACTION_DOWN 之外,我没有得到任何其他事件 - 这很难看,因为启动投掷的实际代码位于 ACTION_MOVE 案例中.

你能帮帮我吗?我无法得到的烦人的事情:它似乎在官方 Launcher 应用程序中以相同的方式实现。但是他们的代码有效,我的无效。我错过了什么?

【问题讨论】:

  • 我之前在自定义实现中遇到过类似的问题。 (不适合自定义视图)。您是否已经阅读了 Launcher2 源代码? android.git.kernel.org/?p=platform/packages/apps/…
  • 我现在做了 - 但据我所知,他们只是添加了处理第二个指针的功能,这在我的情况下不需要。

标签: android user-interface event-handling intercept touch-event


【解决方案1】:

其实很简单:

1) 如果你从 onInterceptTouchEvent 返回 false:

  • 当前事件,如果你愿意,在你处理它之后,也将被分派到目标(子)视图的 onTouchEvent 方法;
  • 下一个事件仍将分派给 onInterceptTouchEvent

2) 如果你从 onInterceptTouchEvent 返回 true:

  • 当前事件不会被目标视图处理,它会接收相同的事件,但带有动作ACTION_CANCEL;
  • 所有进一步的事件将被传递到此视图的 onTouchEvent 方法,并且不再出现在 onInterceptTouchEvent 中。

所以如果你想在 onInterceptTouchEvent() 中处理事件并将它们转发到目标视图,则使用选项 1),如果你想接管所有事件流,则使用选项 2),切断目标视图和处理父视图 onTouchEvent() 中的所有事件,就好像它是原始目标一样。

我已经测试了选项 1),它对我有用。

【讨论】:

    【解决方案2】:

    我遇到了和你一样的问题。我不确定它是否适合您,但可以通过将我的自定义 ViewGroup 的子项设置为“true”来解决。

    【讨论】:

    • 你指的是ViewGroup的哪个方法?现在我不知道你在说什么,请更准确一点。 :)
    • 我创建了扩展 FrameLayout 的自定义 ViewGroup,并在我的 ViewGroup 中放置了几个文本视图。我没有像您的情况那样在 onInterceptTouchEvent() 中得到 ACTION_MOVE 。我使文本视图可点击并且我工作了。在我尝试的过程中,我发现如果我的 ViewGroup 中的视图是一个列表视图,它可以在不设置可点击的情况下正常工作。
    【解决方案3】:

    这是因为如果您的孩子不可点击,则意味着他们不会接受任何触摸事件。这个时候,如果你的viewgroup也不接受触摸事件,android view system 不会将您的视图组及其后代视为触摸事件目标,因此 android 视图系统将触摸事件移交给您的视图组的父级。 (不可点击意味着 textview 将不接受 touchevent)

    【讨论】:

      猜你喜欢
      • 2010-12-28
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多