Android:使用RealViewSwitcher像主屏幕一样在视图之间切换

3
我正在开发一个小而不错的开源项目:一个RealViewSwitcher,它允许通过水平滑动来切换多个视图 - 就像Android的Launcher一样。它只是一个简单的ViewGroup,实现了onInterceptTouchEventonTouchEvent来使事情正常工作。实际上,大部分代码都来自文件Workspace.java(第572行及以下),因此这两种处理触摸事件的方法没有太多变化。
然而,我无法让这个东西工作。我的当前工作类发布在这里(在pastebin上,因为它非常大):http://pastebin.com/8p8GCEZK 如果我执行我的类(只是创建它,添加一些TextViews,然后将其设置为活动的内容视图),如果我快速滑动,我会得到以下输出:
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 - 这很烦人,因为实际启动fling的代码位于ACTION_MOVE中。

你能帮助我吗?让我感到困扰的是:官方Launcher应用程序以相同的方式实现。但他们的代码可以工作,我的不可以。我错过了什么?


我之前在自定义实现中也遇到了类似的问题(针对自定义视图的D'n'd)。你已经阅读过Launcher2源代码了吗?http://android.git.kernel.org/?p=platform/packages/apps/Launcher2.git;a=summary - Sebastian Roth
我现在已经做了——但是从我所看到的,他们只是添加了处理第二个指针的功能,这在我的情况下是不需要的。 - mreichelt
3个回答

2

其实很简单:

1)如果您从onInterceptTouchEvent()返回false:

  • 当前事件在您处理完毕后,也将被转发到目标(子)视图的onTouchEvent()方法中;
  • 下一个事件仍将被分派到onInterceptTouchEvent()。

2)如果您从onInterceptTouchEvent()返回true:

  • 当前事件不会由目标视图处理,而是将接收相同的事件,但具有ACTION_CANCEL操作;
  • 以后的所有事件都将传递给此视图的onTouchEvent()方法,并且不再出现在onInterceptTouchEvent()中。

因此,如果您希望在onInterceptTouchEvent()内处理事件并将它们转发到目标视图,则使用选项1),如果您想接管所有事件流程并截断目标视图并将所有事件处理为父视图的onTouchEvent(),就使用选项2)。

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


0

我曾经遇到过和你一样的问题。虽然不确定这个方法是否适用于你,但是我的问题是通过将自定义ViewGroup的子项设置为“true”来解决的。


你指的是 ViewGroup 的哪个方法?目前我不知道你在说什么,请更加具体明确一些。 :) - mreichelt
我创建了一个自定义ViewGroup,扩展了FrameLayout,并在其中放置了几个TextView。与你的情况不同,我在onInterceptTouchEvent()中没有得到ACTION_MOVE事件。我将TextView设置为可点击并且它起作用了。在尝试过程中,我发现如果我的ViewGroup内部的视图是一个ListView,则无需设置可点击即可正常工作。 - hys

0

这是因为如果您的子视图不可点击,意味着它们将不接受任何触摸事件。此时,如果您的ViewGroup也不接受触摸事件,Android视图系统将不会将您的ViewGroup及其后代视图作为触摸事件目标考虑,因此Android视图系统会将触摸事件交给您的ViewGroup的父级处理。(不可点击意味着TextView将不接受触摸事件)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接