禁用Android滚动视图,但仍允许点击滚动视图中的按钮

时间:2013-10-31 06:55:35

标签: android scrollview ontouchevent

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

我已经对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 个答案:

答案 0 :(得分: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 :(得分: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);
}

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