RecyclerView 拖放 - 使用 ItemTouchHelper - 如何在拖动时设置更快的滚动速度?

问题描述 投票:0回答:2

我尝试使用此代码进行拖放:https://github.com/iPaulPro/Android-ItemTouchHelper-Demo

这是视频:https://youtu.be/lMsv2jYpbi4

有没有办法加快拖放过程中的滚动速度?

android scroll drag-and-drop android-recyclerview itemtouchhelper
2个回答
21
投票

在扩展

ItemTouchHelper.Callback
的类中,重写该方法:

@Override
public int interpolateOutOfBoundsScroll(RecyclerView recyclerView, int viewSize, int viewSizeOutOfBounds, int totalSize, long msSinceStartScroll) {
    final int direction = (int) Math.signum(viewSizeOutOfBounds);
    return 10 * direction;
}

这是一个使用固定滚动速度的简单示例,但如果您想要一些开始缓慢并加速的东西(如

super.interpolateOutOfBoundsScroll
所做的),您可以根据滚动以来的时间(
msSinceStartScroll
)进行一些数学计算,并且整个滚动中的位置(例如,在滚动条中间时滚动速度更快,在接近开始/结束时滚动速度更慢)。


0
投票

我有类似的解决方案,但它包含增加/减少速度取决于出界百分比:

override fun interpolateOutOfBoundsScroll(
    recyclerView: RecyclerView,
    viewSize: Int,
    viewSizeOutOfBounds: Int,
    totalSize: Int,
    msSinceStartScroll: Long
): Int {
    /** Getting sign (+ / -). */
    val sign = sign(viewSizeOutOfBounds.toDouble()).toInt()

    /** Reach maximum ratio when half of item is out of bounds. */
    val boundsHeight = viewSize / 2
    val boundsRatio = min(a = 1f, b = abs(viewSizeOutOfBounds).toFloat() / boundsHeight)

    /** Value could be rounded to 0, when converted to [Int], if [Float] value is small. */
    val scroll = (MAX_DRAG_SPEED * boundsRatio).toInt().takeIf { it != 0 } ?: 1

    /** Sign needed to move in proper direction. */
    return sign * scroll
}
© www.soinside.com 2019 - 2024. All rights reserved.