android - Android ScrollView 中的 VerticalScrollExtent 是什么?

标签 android listview android-listview android-scrollview

从我的一个其他问题的答案中,我找到了一个 Google Demo of a ListView subclass允许项目重新排序。

演示效果很好,但我在理解它的工作原理时遇到了一些问题: 当一个项目被拖动到 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是滚动位置=向上/向下滚动了多少个单位/像素
  • range是完整内容的高度。
  • extent - 那么,这是什么?

ListViewView 继承了 computeVerticalScrollExtent() 文档说:

Compute the vertical offset of the vertical scrollbar's thumb within the horizontal range. This value is used to compute the position of the thumb within the scrollbar's track.

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

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

我想我遗漏了什么,我很高兴得到任何提示!

最佳答案

  • compute*ScrollOffset - 定义可滚动区域的起点和可滚动区域内当前 View 窗口的顶部之间的距离。因此,举例来说,如果您的列表有 10 个项目,并且您已经向下滚动,所以第 3 个项目位于最上面的可见项目,则偏移量为 3(或 3*itemHeight,见下文)。

    <
  • compute*ScrollExtent - 定义可滚动区域内当前 View 窗口的大小。因此,例如,如果您的列表有 10 个项目,而您目前可以看到其中的 5 个项目,则范围为 5(或 5*itemHeight,见下文)。

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

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

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

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

关于android - Android ScrollView 中的 VerticalScrollExtent 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24302295/

相关文章:

动态的Android按钮边框

android - 使用 android 和 Graph api 在 facebook 中创建相册

java - ListView 显示不同类型的行

android - 多列 ListView

android - 使用 Picasso 在滚动列表中加载图像时崩溃应用程序

Android 音频 Remote

android - 如何处理 ListView 中的 ViewStub

android - 在项目上单击监听器以扩展 ArrayAdapter 的 ListView

android - 在 ListView 中显示结果集(不是游标)

java - 从Android应用程序中的其他模块引用公共(public)模块