当前位置: 首页 > 知识库问答 >
问题:

Android LinearSnapHelper-如何提高滚动/“抓拍”速度?

宰坚
2023-03-14

我正在使用LinearSnapHelper来使我的RecyclerView中的项目在屏幕上“对齐”(我的卡片占据了屏幕的大部分,所以我希望它们在每次刷/抛/滚动时都对齐并填充屏幕)。

我在苦苦思索如何让卡片更快地卡入位。我已经尝试创建自定义的LinearLayoutManager(并编辑ScrolltopositionSmoothScrolltoposition中的CalculatesPeedPerPixel方法),以及自定义的RecyclerView(并编辑fling方法)。但没有任何东西影响卡“卡”入位的速度。

我想问题是我真的不明白linearsnaphelper是如何将卡片“滚动”到正确的位置的。它似乎没有使用linearlayoutmanagerscrolltopositionsmoothscrolltoposition方法。

    snapHelper = new LinearSnapHelper() {
        @Override
        public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY) {
            View centerView = findSnapView(layoutManager);
            if (centerView == null) {
                return RecyclerView.NO_POSITION;
            }

            int position = layoutManager.getPosition(centerView);
            int targetPosition = -1;
            if (layoutManager.canScrollHorizontally()) {
                if (velocityX < 0) {
                    targetPosition = position - 1;
                } else {
                    targetPosition = position + 1;
                }
            }

            if (layoutManager.canScrollVertically()) {
                if (velocityY > 0) {
                    targetPosition = position + 1;
                } else {
                    targetPosition = position - 1;
                }
            }

            final int firstItem = 0;
            final int lastItem = layoutManager.getItemCount() - 1;
            targetPosition = Math.min(lastItem, Math.max(targetPosition, firstItem));
            return targetPosition;
        }
    };
    snapHelper.attachToRecyclerView(mRecyclerView);

共有1个答案

慎志国
2023-03-14

如前所述,SnapHelper调用了RecyclerView.SmoothScrollBy()方法。并且它使用默认的squinticinterpolator。要更改快照速度,您可以执行以下操作:

public class SlowdownRecyclerView extends RecyclerView {

// Change pow to control speed.
// Bigger = faster. RecyclerView default is 5.
private static final int POW = 2;

private Interpolator interpolator;

public SlowdownRecyclerView(Context context) {
    super(context);
    createInterpolator();
}

public SlowdownRecyclerView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    createInterpolator();
}

public SlowdownRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    createInterpolator();
}

private void createInterpolator(){
    interpolator = new Interpolator() {
        @Override
        public float getInterpolation(float t) {
            t = Math.abs(t - 1.0f);
            return (float) (1.0f - Math.pow(t, POW));
        }
    };
}

@Override
public void smoothScrollBy(int dx, int dy) {
    super.smoothScrollBy(dx, dy, interpolator);
}

也可以实现自己的插值器。

 类似资料:
  • 嗨,有没有什么方法可以提高滚动速度。我找到了一些解决方案,但都不适合我。这就是我尝试的: 或者使用css: 还有别的办法吗?编辑:上面的解决方案都不起作用,我试图使用大得离谱的数字,但滚动速度还是一样

  • 我正在项目的中添加。 所有工作都很好,但在JPanel中使用鼠标滚轮滚动鼠标存在一个问题。滚动时速度很慢。如何让它更快? 我的代码是:

  • 问题内容: 我看到了启用或禁用鼠标滚轮滚动的方法。但是,有什么方法可以调整滚动速度?我认为这太慢了。不管我使窗口多大,每次单击滚动大约三个像素。我希望它远不止于此。 有任何想法吗? 问题答案: 您可以尝试以下方法:

  • 本文向大家介绍如何提高.Net动态页面响应速度?相关面试题,主要包含被问及如何提高.Net动态页面响应速度?时的应答技巧和注意事项,需要的朋友参考一下 研究表明,页面响应速度超过5秒,90%的用户会选择关闭页面。影响页面响应速度因素很多,分别从前端,后端,数据库,运维阐述。 一、前端性能优化(引用网址 https://www.jianshu.com/p/60b715bd5d73) 思路:分析一个

  • 本文向大家介绍如何提高javascript加载速度,包括了如何提高javascript加载速度的使用技巧和注意事项,需要的朋友参考一下 方法如下: 1、将所有<script>标签放在尽可能接近<body>标签底部的位置,以保证页面在脚本运行之前完成解析尽量减少对整个页面下载的影响 2、限制页面的<script>总数也可以改善性能。每当页面解析碰到一个<script>标签时, 紧接着有一段时间用于代

  • 我是Apache Hbase的新手,我使用的是hbase-0.98.13,并且我已经创建了一个表示例,其列族为sample_family。并且我已经将pig脚本的输出加载到hbase表中。当我尝试基于列族中的一个列扫描表时,它需要超过2分钟。 是否为此进行任何配置更改?有人能帮我吗?