【问题标题】:Is there any way to calculate scroll-end position有没有办法计算滚动结束位置
【发布时间】:2015-07-29 03:54:00
【问题描述】:

我想知道滚动(recyclerview、scrollview)将在 Fling 方法中以速度停止滚动的位置。 有什么方法可以计算吗?

【问题讨论】:

    标签: android scrollview android-recyclerview


    【解决方案1】:

    我查看了source code of RecyclerView,它使用了一个带有以下成员变量的内部类 ViewFlinger:

    private ScrollerCompat mScroller;
    

    总而言之,当检测到投掷时,它由 ViewFlinger 的实例处理。 ViewFlinger 然后在 mScroller 上设置投掷速度并让它计算出动画曲线。 ScrollerCompat 是你想要得到的 b/c 它有方便的 API 来获取滚动的 final x and y。不幸的是,您需要访问的 ScrollerCompat 实例 mScroller 没有被 RecyclerView 公开。 mScroller.fling(0, 0, velocityX, velocityY, Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE); 两种可能的解决方案。一旦你获得了 fling 事件并涉及获取或创建一个 ScrollerCompat 实例,两者都应该完成:

    1. 使用反射来获取 mScroller 实例。
    2. 保留一个 ScrollerCompat 实例,并以与 RecyclerView 相同的方式对其进行初始化。然后传入抛射速度:mScroller.fling(0, 0, velocityX, velocityY, Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE);

    获得 ScrollerCompat 实例后,调用公共 API 以获取最终的 x 和 y 位置。假设您有大小相同的视图并且知道您在列表中的起始位置,您可以计算它将登陆的视图。像这样的:

    // Assumes vertical scrolling
    const int childHeight = this.getChildren().getChildAt(0).getHeight();
    float childOffset = mScroller.getFinalY() / childHeight;
    

    【讨论】:

    • 我使用了反射,效果很好。感谢@TrevorCarothers 的提醒!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 2012-06-23
    • 1970-01-01
    • 2018-02-24
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多