我正在做一个小的,但很好的开源项目:一个RealViewSwitcher
允许在多个视图之间切换通过执行一个水平抛出-就像android的启动程序一样。它只是一个简单的ViewGroup
实现onInterceptTouchEvent
和onTouchEvent
使事情正常工作。事实上,大多数代码都来自文件Workspace.java
(第572行和下面的代码),处理触摸事件的两种方法也是如此——没有太多更改。
但是,我不能让这东西工作。我现在的工人阶级在这里(因为它很大,所以贴在了Pastebin上):
http://pastebin.com/8p8GCEZK
如果我执行我的类(只是创建它,添加一些文本视图,然后将其设置为活动的内容视图),那么如果我快速执行,就会得到以下输出:
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的实际代码位于ACTION_MOVE
案例中。你能帮我吗?最让我恼火的是:在正式的启动程序应用程序中,它似乎是以同样的方式实现的。但他们的代码行得通,我的不行。我缺了什么?
最佳答案
其实很简单:
1)如果从IntercepttouchEvent返回False:
如果您愿意,在处理完当前事件之后,它也将被发送到目标(子)视图的ontouchevent方法;
下一个事件仍将被发送到OnIntercepttouchEvent
2)如果从IntercepttouchEvent返回true:
当前事件将不由目标视图处理,目标视图将接收相同的事件,但操作取消;
所有进一步的事件都将传递到此视图的OntouchEvent方法,并且不再出现在OnInterceptTouchEvent中。
因此,如果要在onIntercepttouchEvent()中处理事件并将其转发到目标视图,请使用选项1;如果要接管所有事件流,请使用选项2,切断目标视图并处理父视图ontouchevent()中的所有事件,就好像它是原始目标一样。
我已经测试了选项1),它对我有效。