Android ScrollView中的VerticalScrollExtent是什么?

从回答我的其他问题之一,我发现一个ListView子类的Google演示 ,允许项目重新sorting。

演示效果很好,但是在理解它是如何工作的时候遇到了一些麻烦:当一个项目拖到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; } 
  • height是ListView自身的高度
  • offset是滚动位置=向上/向下滚动了多less单位/像素
  • range是完整内容的高度。
  • extent – 嗯,这是什么?

ListViewViewinheritancecomputeVerticalScrollExtent() ,并且文件说:

计算垂直滚动条的拇指在水平范围内的垂直偏移量。 该值用于计算滚动条轨迹中的拇指位置。

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

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

我觉得我失去了一些东西,我很高兴任何提示!

Solutions Collecting From Web of "Android ScrollView中的VerticalScrollExtent是什么?"

这有点晚了,但希望没关系。

1)该方法实际上是由子类实现的。 例如, 这就是AbsListViewListView的超类)的样子。
2) View的高度可以不同于垂直滚动的高度 – 想象一下带有奇怪的顶部/底部填充的View

这两点几乎使其他问题无关:)

  • compute * ScrollOffset – 定义可滚动区域开始和可滚动区域内当前视图窗口顶部之间的距离。 例如,如果您的列表中有10个项目,并且向下滚动,所以第三个项目位于最顶端的可见项目,则偏移量为3(或3 * itemHeight,见下文)。

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

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

请注意,所有这些方法可以返回不同的单位取决于其实施,所以对于上面的例子,我使用的索引,但在某些情况下,这些方法将返回相当于项目的宽度或高度的像素值。

特别是,RecyclerView的LinearLayoutManager将返回索引,如果'平滑滚动条'function启用,否则将返回像素值。 请参阅支持库中的ScrollbarHelper以获取更多信息。

其他阅读: https : //groups.google.com/forum/#!topic/ android-developers/ Hxe-bjtQVvk

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

 scrollbarTop = (float)this.computeVerticalScrollExtent()/this.computeVerticalScrollRange()*this‌​.computeVerticalScrollOffset(); scrollbarBottom = (float)this.computeVerticalScrollExtent()/this.computeVerticalScrollRange()*(thi‌​s.computeVerticalScrollExtent()+this.computeVerticalScrollOffset());