如何在RecyclerView中制作假刷卡
就像您不能忽视的那些通知:您一直滑到中间,然后停止。有谁知道如何在RecyclerView中做到这一点?如何在RecyclerView中制作假刷卡
如果你不记得:
https://youtu.be/eFvhFkZfGlA
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public float getSwipeThreshold(RecyclerView.ViewHolder viewHolder) {
return 1;
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);
这里的关键部分是
。getSwipeThreshold
方法
----------------------------------
编辑:其实,有一个更重要的是,我无法找到一种方法来准确实现所要求的内容(完全像视频和Android通知栏),但由于我在这里有错误的答案,我决定编辑我的文章并实施一些与它。
除了在ItemTouchHelper.SimpleCallback
类中提及的内容和字段外,还有其他方法可以被覆盖。
领域:
private final float stopPoint = 200; // The point where items stop when move past it
private final float swipeStopFraction = 0.002f; // higher means items stop sooner when swiped
private final float swipeSpeedFraction = 0.8f; // lower means items move slower when swiped
private float prevA = 1;
private float a = 1;
private float prevDX;
private float backDX;
private boolean leftLock = false;
private boolean rightLock = false;
private boolean leftExpanded = false;
private boolean rightExpanded = false;
private CustomRecyclerViewAdapter.CustomViewHolder prevHolder;
其他方法:
@Override
public float getSwipeVelocityThreshold(float defaultValue) {
return 0;
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
final CustomRecyclerViewAdapter.CustomViewHolder holder = (CustomRecyclerViewAdapter.CustomViewHolder) viewHolder;
prevHolder = holder;
dX *= swipeSpeedFraction;
if (!isCurrentlyActive) {
if (!leftLock) {
leftExpanded = false;
}
if (!rightLock) {
rightExpanded = false;
}
a = 0;
}
if (isCurrentlyActive) {
if (dX > 0 && !rightExpanded) {
leftExpanded = true;
}
if (dX < 0 && !leftExpanded) {
rightExpanded = true;
}
}
float cachedDX = dX;
if (a == 0) {
if (dX/prevA > stopPoint && !rightExpanded && backDX == 0) {
leftLock = true;
leftExpanded = true;
}
if (dX/prevA < -stopPoint && !leftExpanded && backDX == 0) {
rightLock = true;
rightExpanded = true;
}
if (backDX != 0) {
dX += backDX - dX;
backDX /= 2;
} else {
dX /= prevA;
}
a = 1;
} else if (dX == 0) {
backDX = 0;
} else if (dX > 0) {
if (leftExpanded) {
if (backDX != 0) {
leftLock = true;
}
dX /= a;
prevA = a;
a += swipeStopFraction * (cachedDX - prevDX);
} else {
dX = - stopPoint + dX;
if (backDX > 0) {
a += 0.01 * (cachedDX - prevDX);
}
dX /= a;
backDX = dX;
rightLock = false;
}
} else if (dX < 0) {
if (rightExpanded) {
if (backDX != 0) {
rightLock = true;
}
dX /= a;
prevA = a;
a -= swipeStopFraction * (cachedDX - prevDX);
} else {
dX = stopPoint + dX;
if (backDX < 0) {
a -= 0.01 * (cachedDX - prevDX);
}
dX /= a;
prevA = a;
backDX = dX;
leftLock = false;
}
}
prevDX = cachedDX;
if (leftLock) {
if (dX < stopPoint) {
dX = stopPoint;
}
}
if (rightLock) {
if (dX > -stopPoint) {
dX = -stopPoint;
}
}
// Below lines provide background for the empty area when the item is swiped.
// Container could be any layout that is the root layout if the item
final Paint paint = new Paint();
paint.setColor(getResources().getColor(R.color.colorAccent));
if (dX > 0) {
c.drawRect(holder.container.getLeft(), holder.container.getTop(), dX, holder.container.getBottom(), paint);
} else {
c.drawRect(holder.container.getRight() + dX, holder.container.getTop(), holder.container.getRight(), holder.container.getBottom(), paint);
}
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);
if (prevHolder != null && viewHolder != null && prevHolder != viewHolder) {
leftLock = false;
rightLock = false;
leftExpanded = false;
rightExpanded = false;
prevHolder.container.setTranslationX(0); // Container could be any layout that is the root layout if the item
}
}
过的回收鉴于这是怎么回事的控制是非常有限的,我不能进一步推它的任何。我希望这可能会有所帮助。
就我个人而言,我认为这样做与ItemTouchHelper
是非常难以实施和管理,结果将不会被接受。
你可能没有得到我的问题。这段代码只是让你刷更多的项目被考虑刷卡。 –
是的,你是对的@HugoCastelani,无论如何,我试图添加一些变化,以产生最接近您所问的效果,但我无法设法完全按照您的示例。 –
我认为这样做会更好。谢谢! –
我希望这可以通过SwipeDismissBehavior完成 – Killer
你能举个例子吗? –