Android ScrollView中的VerticalScrollExtent是什么?

And*_*ord 8 android listview android-listview android-scrollview

从我对其他一个问题的回答中,我发现了一个允许项目重新排序的ListView子类的Google Demo.

该演示工作得很好,但我很难理解它是如何工作的:当一个项目被拖动到ListView的边界上方/下方时,ListView开始向上/向下滚动以显示新项目.必要的计算使用底层ScrollView的不同参数:

public boolean handleMobileCellScroll(Rect r) {         
    int offset = computeVerticalScrollOffset();
    int height = getHeight();
    int extent = computeVerticalScrollExtent();
    int range = computeVerticalScrollRange();
    int hoverViewTop = r.top;
    int hoverHeight = r.height();       

    if (hoverViewTop <= 0 && offset > 0) {
        smoothScrollBy(-mSmoothScrollAmountAtEdge, 0);
        return true;
    }

    if (hoverViewTop + hoverHeight >= height && (offset + extent) < range) {
        smoothScrollBy(mSmoothScrollAmountAtEdge, 0);
        return true;
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)
  • height是ListView本身的高度
  • offset是滚动位置=向上/向下滚动了多少单位/像素
  • range是完整内容的高度.
  • extent - 嗯,这是什么?

ListView继承computeVerticalScrollExtent()自View和实况说:

计算垂直滚动条拇指在水平范围内的垂直偏移.此值用于计算滚动条轨道内拇指的位置.

如果看一下代码 computeVerticalScrollExtent()不是由其中一个子类实现的,而是直接由它实现View:它只返回视图的高度.

这是有道理的:如果ListView/ScrollView的高度为500,那么一次可见的滚动内容部分也是500.这是ScrollExtent的含义吗?为什么ScrollExtent必要?为什么不直接使用getHeight()?

我想我错过了一些东西,我对任何暗示感到高兴!

The*_*eIT 8

  • compute*ScrollOffset - 定义可滚动区域的开头与可滚动区域内当前视图窗口顶部之间的距离.因此,例如,如果您的列表有10个项目并且您已向下滚动以使第3个项目位于最顶部可见项目,则偏移量为3(或3*itemHeight,请参见下文).

  • compute*ScrollExtent - 定义可滚动区域内当前视图窗口的大小.因此,例如,如果您的列表有10个项目,并且您当前可以看到其中5个项目,那么范围是5(或5*itemHeight,见下文).

  • compute*ScrollRange - 定义当前可滚动区域的大小.因此,例如,如果您的列表有10个项目,那么范围是10(或10*itemHeight,见下文).

请注意,所有这些方法都可以根据其实现以不同的单位返回值,因此对于上面的示例,我使用索引,但在某些情况下,这些方法将返回等于项的宽度或高度的像素值.

特别是,如果启用了"平滑滚动条"功能,RecyclerView的LinearLayoutManager将返回索引,否则它将返回像素值.有关ScrollbarHelper更多信息,请参阅支持库.

补充阅读:https://groups.google.com/forum/#!topic / android-Developers/Hxe-bjtQVvk


Dog*_*cat 2

有点晚了,但希望一切都好。

1)该方法实际上是由子类实现的。例如,这AbsListView就是(ListView的超类)的样子。
2)View的高度可能与其垂直滚动的高度不同 - 想象一下View具有奇怪的顶部/底部填充的 。

这两点几乎使其他问题变得无关紧要:)