gpt4 book ai didi

Android LinearSnapHelper - 如何提高滚动/"snapping"的速度?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:52:23 25 4
gpt4 key购买 nike

我正在使用 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);

最佳答案

正如郭 Jade 龙所说,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);
}

或者您可以实现自己的插值器。

关于Android LinearSnapHelper - 如何提高滚动/"snapping"的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40334601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com