技術點
1.在不觸摸屏幕的情況下胚鸯,卡片呈現(xiàn)層疊布局。
2.拖拽時笨鸡,下層的布局隨最上層卡片的位置放大或縮小
層疊布局
static int MAX_COUNT=4姜钳;//最大可視view數(shù)
主要重寫LayoutManager的onLayoutChildren()方法,重新排列item的位置
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
super.onLayoutChildren(recycler, state);
//在布局之前形耗,將所有的子View先Detach掉哥桥,放入到Scrap緩存中
detachAndScrapAttachedViews(recycler);
int itemCount = getItemCount();//子view總數(shù)
//getChildCount() 被回收的不計算在內
for (int i = 0; i < itemCount; i++) {
//從緩存中取出
View view = recycler.getViewForPosition(i);
addView(view);
measureChildWithMargins(view,0,0);
int width=getDecoratedMeasuredWidth(view);
int height=getDecoratedMeasuredHeight(view);
layoutDecoratedWithMargins(view,0,0,width,height);
if (i>itemCount-MAX_COUNT-1){//i=6,7,8,9.在最上層的四個
view.setScaleX(1-(itemCount-i-1)*0.05f);
view.setTranslationY((itemCount-i-1)*30);//每次多向下平移30px
}else{
//除了最上面四個外,其他的大小都與從上面數(shù)第四個一樣大
view.setScaleX(1-(MAX_COUNT-1)*0.05f);
view.setTranslationY((MAX_COUNT-1)*30);
}
}
}
滑動效果
重寫ItemTouchHelper.Callback的onChildDraw()方法激涤,此方法用于實時繪制子view拟糕。
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
float dX, float dY, int actionState, boolean isCurrentlyActive) {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
int itemCount = recyclerView.getChildCount();
double fraction = Math.sqrt(dX * dX + dY * dY) / recyclerView.getWidth();
float fractionX=dX/recyclerView.getWidth()/2;
for (int i = 0; i < itemCount; i++) {
View view = recyclerView.getChildAt(i);
if (i == itemCount - 1) {
view.setRotation(fractionX*30);
} else {
if (i > ]MAX_COUNT-1) {
view.setScaleX((float) (1 - (itemCount - i - 1) * 0.05f + 0.05f * fraction));
view.setTranslationY((float) ((itemCount - i - 1) * 30 - 30 * fraction));
} else {
}
}
}
}