Android ScrollView中的VerticalScrollExtent是什么?

Android ScrollView中的VerticalScrollExtent是什么?,android,listview,android-listview,android-scrollview,Android,Listview,Android Listview,Android Scrollview,从对我的另一个问题的回答中,我发现了一个允许物品重新排序的选项 演示效果很好,但我很难理解它是如何工作的: 当项目被拖动到ListView边界的上方/下方时,ListView开始向上/向下滚动以显示新项目。必要的计算使用下划线滚动视图的不同参数: public boolean handleMobileCellScroll(Rect r) { int offset = computeVerticalScrollOffset(); int height = getH

从对我的另一个问题的回答中,我发现了一个允许物品重新排序的选项

演示效果很好,但我很难理解它是如何工作的: 当项目被拖动到ListView边界的上方/下方时,ListView开始向上/向下滚动以显示新项目。必要的计算使用下划线滚动视图的不同参数:

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;
}
public boolean handleMobileCellScroll(rectr){
int offset=computeVerticalScrollOffset();
int height=getHeight();
int extent=computeVerticalScrollExtent();
int range=computeVerticalScrollRange();
int hoverViewTop=r.top;
int hoverHeight=r.height();
如果(悬停视图顶部0){
smoothScrollBy(-msmoothScrollAmountedge,0);
返回true;
}
如果(hoverViewTop+hoverHeight>=高度&&(偏移+范围)<范围){
smoothScrollBy(MSMoothScrollAmountedge,0);
返回true;
}
返回false;
}
  • height
    是ListView本身的高度
  • offset
    是滚动位置=向上/向下滚动的单位/像素数
  • range
    是完整内容的高度
  • 范围
    -这是什么?
ListView
继承了
computeVerticalScrollExtent()
来自
View
的内容,文档说明:

计算垂直滚动条的拇指在 水平范围。此值用于计算 滚动条轨迹中的拇指

如果查看
computeVerticalScrollExtent()
不是由一个子类实现的,而是直接由
视图实现的:它只返回视图的高度。

这很有意义:如果ListView/ScrollView的高度为500,则每次可见的滚动内容部分也为500。这就是滚动范围的含义吗为什么需要滚动范围?为什么不直接使用getHeight()呢?


我想我错过了什么,我很高兴听到任何提示

有点晚了,希望没事

1) 该方法实际上是由子类实现的。例如,是
AbsListView
ListView
的超类)的外观
2)
视图
的高度可能不同于其垂直滚动的高度-只需想象一个带有奇怪的顶部/底部填充的
视图


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

这是一个示例代码,可以帮助您了解如何使用computeVerticalScrollExtent获取滚动条的顶部和底部:

scrollbarTop = (float)this.computeVerticalScrollExtent()/this.computeVerticalScrollRange()*this‌​.computeVerticalScrollOffset(); 

scrollbarBottom = (float)this.computeVerticalScrollExtent()/this.computeVerticalScrollRange()*(thi‌​s.computeVerticalScrollExtent()+this.computeVerticalScrollOffset()); 
  • compute*ScrollOffset-定义可滚动区域的起点与可滚动区域内当前视图窗口顶部之间的距离。例如,如果您的列表有10个项目,并且您已向下滚动,使第三个项目位于最可见的项目顶部,则偏移量为3(或3*itemHeight,见下文)

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

  • compute*ScrollRange-定义当前可滚动区域的大小。例如,如果列表中有10个项目,则范围为10(或10*itemHeight,见下文)

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

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


附加阅读:

包含30项的列表视图的滚动范围等于3000,这是由于滚动范围=numberOfItems*100,因此滚动范围=numberOfVisibleItems*100滚动偏移量=numberOfScrolledItems*100。根据以下文章,您可以在AblistView的源代码中找到这些单词的版本:


我发现这个解释是正确的。

您有关于“扩展”的更多信息吗?这是一个示例代码,可以帮助您理解如何使用computeVerticalScrollExtent获取滚动条的顶部和底部:{scrollbarTop=(float)this.computeVerticalScrollExtent()/this.computeVerticalScrollRange()*this.computeVerticalScrollOffset());scrollbarBottom=(float)this.computeVerticalScrollExtent()/this.computeVerticalScrollRange()*(this.computeVerticalScrollExtent()+this.computeVerticalScrollOffset());}