2013-10-31 113 views
0

我希望能够防止用户能够在我的Android ScrollView中滚动,但仍然能够检测他们何时点击滚动视图中的按钮。禁用Android滚动视图,但仍然允许在滚动视图中的按钮上点击

我已经划分了ScrollView类,并且一直在摆弄onInterceptTouchEventonTouchEvent方法,但似乎无法让它完全正确。下面的代码停止滚动,但似乎禁用点击(但不是全部,如果你上下没有任何移动它的工作,但如果你的手指稍微移动,因为你点击它不会注册)。我也刚刚删除了onInterceptTouchEvent,它几乎可以工作,但滚动视图仍然会在用户移除手指时滚动。

 
    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) 
    { 
     App.log("onInterceptTouchEvent, with action : " + ev.getAction()); 
     switch(ev.getAction()) 
     { 
      case MotionEvent.ACTION_MOVE: 
       return true; 
     } 
     return super.onInterceptTouchEvent(ev); 

    } 

    @Override 
    public boolean onTouchEvent(MotionEvent ev) 
    { 
     App.log("onTouchEvent, with action : " + ev.getAction()); 
     switch(ev.getAction()) 
     { 
      case MotionEvent.ACTION_MOVE: 
       return false; 
     } 
     return super.onTouchEvent(ev); 
    } 

回答

2

最后,我发现了以下的解决方案做正是我需要的:

@Override 
public boolean onTouchEvent(MotionEvent ev) 
{ 
    App.log("onTouchEvent, with action : " + ev.getAction()); 
    switch(ev.getAction()) 
    { 
     case MotionEvent.ACTION_MOVE: 
      return false; 
    } 
    return super.onTouchEvent(ev); 
} 
1

您可以覆盖overscrollBy(),如果禁用更改DELTAX &移动deltaY值设置为0。

@Override 
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) 
{ 
    final int dx; 
    final int dy; 

    if (isEnabled()) 
    { 
     dx = deltaX; 
     dy = deltaY; 
    } 
    else 
    { 
     dx = 0; 
     dy = 0; 
    } 

    return super.overScrollBy(dx, dy, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); 
} 

您可能还想在禁用/启用时动态地隐藏/显示滚动条。

+0

嗯......似乎不是正确的答案,肯定有办法阻止在一开始不滚动担心这种'overscroll'业务(并且我不能只用'setOverScrollMode'禁用过度滚动?) –

+1

ScrollView使用该方法执行滚动。无可否认,它几乎不是一个完美的解决方案,但是在ScrollView的接口上没有特定的'allowScrolling(boolean)'或类似的特性来执行你想要的,我认为它和其他方法一样好。 – nmw

相关问题