了解如何使用OverScroller类

时间:2013-09-12 15:51:51

标签: android android-scrollview android-scroll android-overscoll

我正在考虑在我的项目中添加过度滚动(而不是颜色变化),但即使在阅读了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类中?
  3. 这可能是非常明显的,但我在这里挣扎。任何帮助都将非常感谢,谢谢!

2 个答案:

答案 0 :(得分:0)

可能是因为这个?

public class ViewConfiguration{
...
    /**
     * Max distance in dips to overscroll for edge effects
     */
    private static final int OVERSCROLL_DISTANCE = 0;
...
}

答案 1 :(得分:0)

关于 overScrollBydocumentation 说:

<块引用>

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

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

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

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

@Override
public void computeScroll() {
    if(mScroller.computeScrollOffset()) {
        scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
        invalidate();
    }
}