3

我正在开发一个小型但不错的开源项目:一个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

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

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

4

3 回答 3

2

其实很简单:

1) 如果您从 onInterceptTouchEvent 返回 false:

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

2) 如果您从 onInterceptTouchEvent 返回 true:

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

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

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

于 2012-02-05T00:46:48.167 回答
0

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

于 2011-09-18T14:22:34.960 回答
0

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

于 2011-01-04T01:32:48.770 回答