- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 LinearSnapHelper
使我的 RecyclerView
中的项目“捕捉”到屏幕上的位置(我的卡片占据了大部分屏幕,所以我想要它们会卡入到位并在每次滑动/滑动/滚动时填满屏幕)。
我正在努力解决如何让卡片更快卡入到位的问题。我已经尝试创建自定义 LinearLayoutManager
(并在 scrollToPosition
或 smoothScrollToPosition
中编辑 calculateSpeedPerPixel
方法),以及作为自定义 RecyclerView
(并编辑 fling 方法)。但没有什么会影响卡片“卡入”到位的速度。
我想问题是我不太明白 LinearSnapHelper
如何将卡片“滚动”到位。它似乎没有使用 LinearLayoutManager
的 scrollToPosition
或 smoothScrollToPosition
方法。
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/
我正在使用 LinearSnapHelper 使我的 RecyclerView 中的项目“捕捉”到屏幕上的位置(我的卡片占据了大部分屏幕,所以我想要它们会卡入到位并在每次滑动/滑动/滚动时填满屏幕)。
这是我之前 question 的后续. 在我的应用程序中,我试图让水平 RecyclerView 自动捕捉到中心项目。为此,我附加了一个 LinearSnapHelper。我还创建了一个项目装饰,它向
我关注了this Stack Overflow post创建具有 viewpager 行为的 recyclerview。 工作正常,但我需要在用户抬起屏幕手指时触发滚动到下一个项目。现在仅在 50%
当我将 LinearSnapHelper 与 RecyclerView 一起使用时,我扔掉了 RecyclerView 列表滚动得太远太快了。我可以更改此行为或完全禁用它吗? 最佳答案 尝试改用 Pa
如何在水平 RecyclerView 中捕捉到 LinearSnapHelper() 的特定位置? RecyclerView 有一个函数 scrolltoposition,它滚动到那个位置,但没有将它
我有 recyclerView 可以水平滚动。每个 View 都将捕捉到显示的中心。为了实现这一点,我使用了 LinearSnapHelper。这个工具工作得很好。 问题出在回收站 View 中的la
我已经使用 LinearSnapHelper 实现了水平 recyclerView,以实现选择特定配置的 UI 输入。有点像旧的学校号码选择器/选择器或微调器。中间的项目是选择的位置。 一切正常,但问
我是一名优秀的程序员,十分优秀!