【发布时间】:2012-09-25 23:35:06
【问题描述】:
我有一个顶级 ViewGroup,我称之为 SliderView,我想在其中检测滑动。这主要是有效的,但一个奇怪的失败仍然存在。
SliderView 的本质是重写 onInterceptTouchEvent,一旦用户真正滑动,返回“true”以防止其他视图看到 MotionEvent。这是一段代码:
public class SliderView extends ViewGroup
{
enum MoveState { MS_NONE, MS_HSCROLL, MS_VSCROLL };
private MoveState moveState = MoveState.MS_NONE;
... other code ...
public boolean onInterceptTouchEvent(MotionEvent e)
{
final int action = e.getAction();
switch (action & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:
moveState = MoveState.MS_NONE;
break;
case MotionEvent.ACTION_MOVE:
if (moveState == MoveState.MS_NONE)
{
if (motion is horizontal)
{
moveState = MoveState.MS_VSCROLL;
return true;
}
else
moveState = MoveState.MS_VSCROLL; // let child window handl MotionEvent
}
else if (moveState == MoveState.MS_HSCROLL)
return true; // don't let children see motion event.
}
return super.onInterceptTouchEvent (e);
}
... other code ...
}
据我了解,我的 SliderView(它是最外层的视图)应该始终接收 onInterceptTouchEvent。在我的一项测试中,顶级子级是 a 但是,在以下情况下,这似乎不是。
当顶级子级是 ScrollView 时,onInterceptTouchEvent 会获取 ACTION_MOVE,我的代码会执行我想要的操作。在另一种情况下,顶级子级是 LinearLayout,它有时会失败:它总是获得 ACTION_DOWN 但只有当用户触摸 LinearLayout 内的小部件时才会获得 ACTION_MOVE;如果触摸空白区域,则只有 ACTION_DOWN 通过。
我会注意到它的行为就好像失败案例触摸发生在 SliderView 之外。但是,如果是这样,我为什么会收到 ACTION_DOWN 事件?
第二点:查看 ScrollView 的源代码,我看到它正在检查“inChild”;我还没有弄清楚它的用途以及它的相关性。
【问题讨论】:
-
你解决过这个问题吗?
-
不,但是在阅读更多文档时,我了解到有一种叫做 ViewPager 的东西,它包含了水平滑动。我还没有尝试过,因为我现在正在充实其他东西。我不知道您要做什么,但如果您尝试使用 ViewPager,请告诉我结果。
标签: android scrollview android-linearlayout touch-event motionevent