- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我关注了this Stack Overflow post创建具有 viewpager 行为的 recyclerview。
工作正常,但我需要在用户抬起屏幕手指时触发滚动到下一个项目。现在仅在 50% 可见时捕捉到下一个项目。
更新解决方案
Crysxd 响应是关键。为了检测对齐方向,我在 findTargetSnapPosition 函数的顶部添加了这段代码:
if (velocityY < 0)
snapToPrevious = true
else
snapToNext = true
最佳答案
没有办法绕过自定义 SnapHelper。这是您可以复制到项目中的类。
class ControllableSnapHelper(val onSnapped: ((Int) -> Unit)? = null) : LinearSnapHelper() {
var snappedPosition = 0
private var snapToNext = false
private var snapToPrevious = false
var recyclerView: RecyclerView? = null
override fun attachToRecyclerView(recyclerView: RecyclerView?) {
super.attachToRecyclerView(recyclerView)
this.recyclerView = recyclerView
}
override fun findTargetSnapPosition(layoutManager: RecyclerView.LayoutManager, velocityX: Int, velocityY: Int): Int {
if (snapToNext) {
snapToNext = false
snappedPosition = Math.min(recyclerView?.adapter?.itemCount ?: 0, snappedPosition + 1)
} else if (snapToPrevious) {
snapToPrevious = false
snappedPosition = Math.max(0, snappedPosition - 1)
} else {
snappedPosition = super.findTargetSnapPosition(layoutManager, velocityX, velocityY)
}
onSnapped?.invoke(snappedPosition)
return snappedPosition
}
fun snapToNext() {
snapToNext = true
onFling(Int.MAX_VALUE, Int.MAX_VALUE)
}
fun snapToPrevious() {
snapToPrevious = true
onFling(Int.MAX_VALUE, Int.MAX_VALUE)
}
}
您也可以将 LinearSnapHelper
替换为 PagerSnapHelper
。只需调用 snapToNext()
或 snapToPrevious()
。我还实现了一个在构造函数中传递的回调。
我们只是重写了 findTargetSnapPosition(...)
方法。此方法可以返回任何位置,然后 SnapHelper
实现将计算滚动动画以到达该位置。函数 snapToNext()
和 snapToPrevious()
只是设置一个 bool 值,告诉我们下一次 findTargetSnapPosition(...) 捕捉到下一个或上一个 View
被调用。添加一个 snapTo(index: Int)
函数也非常简单。设置 bool 值后,我们需要开始捕捉进度。为此,我们调用了 onFling(...)
,它会在用户移动 RecyclerView
时调用。我们需要传入一个超过 SnapHelper
设置的最小速度的值,所以我们只使用 Int.MAX_VALUE
。由于我们从不调用 super.findTargetSnapPosition(...)
,因此 PagerSnapHelper
使用的实际速度并不重要。
关于android - 使用 LinearSnapHelper 的 Recyclerview - 从屏幕上松开手指时捕捉到下一个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48943943/
对不起: 我只是不知道如何链接这些连续的操作? 鼠标按下然后拖动然后松开。如果用户不执行此操作,则不会发生某些操作... 我是否应该添加代码,因为已经按下了区分它? 常量 MOUSE_MOVED 不起
我正在尝试使用 native javascript - 没有 jQuery,也就是说。捏合和松开但不适用于缩小/放大。它在 iOS 和 android 上使用触摸等很好。但我不知道如何为我的 Mac-
我是一名优秀的程序员,十分优秀!