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

我希望能够防止用户能够在我的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);
    }


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

@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);
}

如果禁用,您可以覆盖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);
}

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

链接地址: http://www.djcxy.com/p/91253.html

上一篇: Disable Android scrollview, but still allow taps on buttons in the scroll view

下一篇: Handle a fling/scroll in Android without consuming the MotionEvent