我尝试使用此代码进行拖放:https://github.com/iPaulPro/Android-ItemTouchHelper-Demo。
这是视频:https://youtu.be/lMsv2jYpbi4
有没有办法加快拖放过程中的滚动速度?
在扩展
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
)进行一些数学计算,并且整个滚动中的位置(例如,在滚动条中间时滚动速度更快,在接近开始/结束时滚动速度更慢)。
我有类似的解决方案,但它包含增加/减少速度取决于出界百分比:
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
}