gpt4 book ai didi

android - ItemTouchHelper : Prevent out of bounds dragging

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:55 25 4
gpt4 key购买 nike

我有一个带有 ItemTouchHelper 的回收站 View 。它允许拖动项目。

我想将拖动限制在回收器 View 的范围内 - 也就是说,您不能只将 View 拖到容器外,这样它就会消失。

我试过像这样检查绝对坐标:

 @Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
recyclerView.getLocationOnScreen(pos);
int rvY = pos[1];
viewHolder.itemView.getLocationOnScreen(pos);
int vhY = pos[1];


if (rvY > vhY || rvY + recyclerView.getHeight() < vhY + viewHolder.itemView.getHeight()) {
return;
}
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
...
}

但后来我遇到了渲染并发问题 - 如果我缓慢移动 View ,它会在超出范围时停止移动,但如果我移动得更快 - 那么它无论如何都会离开回收器 View 边界。

有什么想法/方法吗?

最佳答案

dY 和 dX 值必须被裁剪到 RecyclerView 的边界:

override fun onChildDraw(c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dX: Float, dY: Float, actionState: Int, isCurrentlyActive: Boolean) {
val clippedDx = clip(recyclerView.width, viewHolder.itemView.left, viewHolder.itemView.right, dX)
val clippedDy = clip(recyclerView.height, viewHolder.itemView.top, viewHolder.itemView.bottom, dY)
super.onChildDraw(c, recyclerView, viewHolder, clippedDx, clippedDy, actionState, isCurrentlyActive)
}

private fun clip(size: Int, start: Int, end: Int, delta: Float): Float {
val newStart = start + delta
val newEnd = end + delta

val oobStart = 0 - newStart
val oobEnd = newEnd - size

return when {
oobStart > 0 -> delta + oobStart
oobEnd > 0 -> delta - oobEnd
else -> delta
}
}

关于android - ItemTouchHelper : Prevent out of bounds dragging,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36223989/

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