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

时间:2010-12-15 23:07:50

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

我正在开发一个小而精彩的开源项目: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

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

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

3 个答案:

答案 0 :(得分:2)

实际上很简单:

1)如果你从onInterceptTouchEvent返回false:

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

2)如果从onInterceptTouchEvent返回true:

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

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

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

答案 1 :(得分:0)

我和你的问题一样。我不确定它对你有用,但是通过将我的自定义ViewGroup的子设置为'true'来解决它。

答案 2 :(得分:0)

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