9

我正在考虑在我的项目中添加过度滚动(不是颜色变化),但即使在阅读了 API 文档和这里的几个问题之后,我仍然不明白我需要做什么才能让它工作。

根据 OverScroller 的 API 文档:“此类封装了滚动,具有超出滚动操作边界的能力。在大多数情况下,此类是 Scroller 的替代品。

我之前在我的父类中有一个 Scroller 对象:

public boolean onTouchEvent(MotionEvent ev) {   
    ....// code to calculate deltas
     if (deltaY != 0 || deltaX != 0)
            scrollBy(deltaX, deltaY);
}

我去把它改成这样:

if (deltaY != 0 || deltaX != 0)
            overScrollBy(deltaX, deltaY, getScrollX(), getScrollY(),
                child.getRight() - getWidth(), child.getBottom() - getHeight(), 
                    OVERSCROLL_DISTANCE, OVERSCROLL_DISTANCE, false);

现在滚动根本不起作用!fling()可以很好地作为替代品,但不能滚动....

总之,我有两个问题:

  1. 为什么滚动不起作用overScrollBy?我是否必须添加其他代码才能使其正常工作?
  2. 为什么我必须打电话mScroller.fling()并且只有overScrollBy()?为什么不mScroller.overScrollBy()呢?它是否以某种方式内置于View课堂中?

这可能很明显,但我在这里挣扎。任何帮助将不胜感激,谢谢!

4

2 回答 2

0

关于文档overScrollBy

调用此方法的视图应覆盖onOverScrolled(int, int, boolean, boolean)以响应过度滚动操作的结果。

正如您在阅读源代码时发现的那样,overScrollBy它本身不执行任何滚动,但它会onOverScrolled在最后调用。
因此,要使滚动发生,您应该在 View 类中添加如下内容:

@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
    scrollTo(scrollX, scrollY);
}

overScrollByView该类的一个方法,用于滚动视图内容(通过onOverScrolled)。
该类OverScroller只是进行一些滚动计算,例如使用mScroller.fling()or mScroller.springBack(),但需要进一步调用才能实际滚动视图内容,通常使用:

@Override
public void computeScroll() {
    if(mScroller.computeScrollOffset()) {
        scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
        invalidate();
    }
}
于 2021-07-15T13:55:24.480 回答
0

也许是因为这个?

public class ViewConfiguration{
...
    /**
     * Max distance in dips to overscroll for edge effects
     */
    private static final int OVERSCROLL_DISTANCE = 0;
...
}
于 2016-05-06T09:09:37.637 回答