我正在开发一个小而精彩的开源项目:RealViewSwitcher
允许通过执行水平投掷在多个视图之间切换 - 就像Android的Launcher一样。只需一个简单的ViewGroup
即可实现onInterceptTouchEvent
和onTouchEvent
来实现目标。事实上,大多数代码都来自文件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。
答案 0 :(得分:2)
实际上很简单:
1)如果你从onInterceptTouchEvent返回false:
2)如果从onInterceptTouchEvent返回true:
所以你使用选项1)如果你想处理onInterceptTouchEvent()中的事件并将它们转发到目标视图,那么如果要接管所有事件流,切断目标视图和处理,则选项2)父视图中的所有事件onTouchEvent()就像它是原始目标一样。
我测试了选项1),它对我有用。
答案 1 :(得分:0)
我和你的问题一样。我不确定它对你有用,但是通过将我的自定义ViewGroup的子设置为'true'来解决它。
答案 2 :(得分:0)
这是因为如果您的孩子无法点击,则表示他们不接受任何触摸事件。这时,如果你的viewgroup也不接受触摸事件,那么android视图系统 不会将您的viewgroup及其后代视为触摸事件目标,因此android视图系统会将触摸事件移交给您的viewgroup的父级。 (nonclickable意味着textview不接受touchevent)