它的item是一个帧布局,后面一个覆盖前面的,最先显示的是最后一张,后面显示的图片需要缩放一点点。没有拖动的时候只显示三张缩小,第三张后面的缩小参数可以说是一样的参数。
至于拖动的话可以使用ItemTouchHelper来辅助使用
public class SlideCardLayoutManager extends RecyclerView.LayoutManager {
@Override
public RecyclerView.LayoutParams generateDefaultLayoutParams() {
return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}
// 布局
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
// ViewHodler回收复用
detachAndScrapAttachedViews(recycler);
int bottomPosition;
int itemCount = getItemCount();
if (itemCount < CardConfig.MAX_SHOW_COUNT) {
bottomPosition = 0;
} else {
// 布局了四张卡片 --- 4,5,6,7
bottomPosition = itemCount - CardConfig.MAX_SHOW_COUNT;
}
for (int i = bottomPosition; i < itemCount; i++) {
// 复用
View view = recycler.getViewForPosition(i);
addView(view);
measureChildWithMargins(view, 0, 0);
int widthSpace = getWidth() - getDecoratedMeasuredWidth(view);
int heightSpace = getHeight() - getDecoratedMeasuredHeight(view);
// 布局 ---draw -- onDraw ,onDrawOver, onLayout
layoutDecoratedWithMargins(view, widthSpace / 2, heightSpace / 2,
widthSpace / 2 + getDecoratedMeasuredWidth(view),
heightSpace / 2 + getDecoratedMeasuredHeight(view));
int level = itemCount - i - 1;
if (level > 0) {
if (level < CardConfig.MAX_SHOW_COUNT - 1) {
view.setTranslationY(CardConfig.TRANS_Y_GAP * level);
view.setScaleX(1 - CardConfig.SCALE_GAP * level);
view.setScaleY(1 - CardConfig.SCALE_GAP * level);
} else {
// 最下面的那个view 与前一个view 布局一样
view.setTranslationY(CardConfig.TRANS_Y_GAP * (level - 1));
view.setScaleX(1 - CardConfig.SCALE_GAP * (level - 1));
view.setScaleY(1 - CardConfig.SCALE_GAP * (level - 1));
}
}
}
}
}
使用ItemTouchHelper来辅助拖拽
SlideCallback slideCallback = new SlideCallback(rv, adapter, mDatas);
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(slideCallback);
itemTouchHelper.attachToRecyclerView(rv);
public class SlideCallback extends ItemTouchHelper.SimpleCallback {
private RecyclerView mRv;
private UniversalAdapter<SlideCardBean> adapter;
private List<SlideCardBean> mDatas;
public SlideCallback(RecyclerView mRv,
UniversalAdapter<SlideCardBean> adapter, List<SlideCardBean> mDatas) {
super(0, 15);
this.mRv = mRv;
this.adapter = adapter;
this.mDatas = mDatas;
}
// drag 拖拽
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return false;
}
// 滑动
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
SlideCardBean remove = mDatas.remove(viewHolder.getLayoutPosition());
mDatas.add(0, remove);
adapter.notifyDataSetChanged();// onMeasure, onlayout
}
// onDraw
@Override
public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
double maxDistance = recyclerView.getWidth() * 0.5f;
double distance = Math.sqrt(dX * dX + dY * dY);
double fraction = distance / maxDistance;
if (fraction > 1) {
fraction = 1;
}
// 显示的个数 4个
int itemCount = recyclerView.getChildCount();
for (int i = 0; i < itemCount; i++) {
View view = recyclerView.getChildAt(i);
int level = itemCount - i - 1;
if (level > 0) {
if (level < CardConfig.MAX_SHOW_COUNT - 1) {
view.setTranslationY((float) (CardConfig.TRANS_Y_GAP * level - fraction * CardConfig.TRANS_Y_GAP));
view.setScaleX((float) (1 - CardConfig.SCALE_GAP * level + fraction * CardConfig.SCALE_GAP));
view.setScaleY((float) (1 - CardConfig.SCALE_GAP * level + fraction * CardConfig.SCALE_GAP));
}
}
}
}
@Override
public long getAnimationDuration(@NonNull RecyclerView recyclerView, int animationType, float animateDx, float animateDy) {
return 1500;
}
}
public class CardConfig {
//屏幕上最多同时显示几个Item
public static int MAX_SHOW_COUNT;
//每一级Scale相差0.05f,translationY相差7dp左右
public static float SCALE_GAP;
public static int TRANS_Y_GAP;
public static void initConfig(Context context) {
MAX_SHOW_COUNT = 4;
SCALE_GAP = 0.05f;
// 把非标准尺寸转换成标准尺寸
TRANS_Y_GAP = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 15, context.getResources().getDisplayMetrics());
}
}