仿照探探卡片滑动
16lz
2021-01-26
SlideCardLayoutManager
package com.enjoy.leo_slidecard;import android.view.View;import android.view.ViewGroup;import androidx.recyclerview.widget.RecyclerView;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)); } } } }}
SlideCallback
package com.enjoy.leo_slidecard;import android.graphics.Canvas;import android.util.Log;import android.view.View;import androidx.annotation.NonNull;import androidx.recyclerview.widget.ItemTouchHelper;import androidx.recyclerview.widget.RecyclerView;import com.enjoy.leo_slidecard.adapter.UniversalAdapter;import java.util.List;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(); Log.i("SlideCallback",">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); Log.i("SlideCallback",""+distance); for (int i = 0; i < itemCount; i++) { Log.i("SlideCallback",""+distance+" "+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)); } } } Log.i("SlideCallback","<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"); } @Override public long getAnimationDuration(@NonNull RecyclerView recyclerView, int animationType, float animateDx, float animateDy) { return 1500; }}
CardConfig
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()); }}
MainActivity
package com.enjoy.leo_slidecard;import androidx.appcompat.app.AppCompatActivity;import androidx.recyclerview.widget.ItemTouchHelper;import androidx.recyclerview.widget.LinearLayoutManager;import androidx.recyclerview.widget.RecyclerView;import android.os.Bundle;import android.widget.ImageView;import com.bumptech.glide.Glide;import com.enjoy.leo_slidecard.adapter.UniversalAdapter;import com.enjoy.leo_slidecard.adapter.ViewHolder;import java.util.List;public class MainActivity extends AppCompatActivity { private RecyclerView rv; private UniversalAdapter<SlideCardBean> adapter; private List<SlideCardBean> mDatas; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rv = findViewById(R.id.rv); rv.setLayoutManager(new SlideCardLayoutManager()); mDatas = SlideCardBean.initDatas(); adapter = new UniversalAdapter<SlideCardBean>(this, mDatas, R.layout.item_swipe_card) { @Override public void convert(ViewHolder viewHolder, SlideCardBean slideCardBean) { viewHolder.setText(R.id.tvName, slideCardBean.getName()); viewHolder.setText(R.id.tvPrecent, slideCardBean.getPostition() + "/" + mDatas.size()); Glide.with(MainActivity.this) .load(slideCardBean.getUrl()) .into((ImageView) viewHolder.getView(R.id.iv)); } }; rv.setAdapter(adapter); // 初始化数据 CardConfig.initConfig(this); SlideCallback slideCallback = new SlideCallback(rv, adapter, mDatas); ItemTouchHelper itemTouchHelper = new ItemTouchHelper(slideCallback); itemTouchHelper.attachToRecyclerView(rv); }}
更多相关文章
- RecyclerView嵌套ScrollView,滑动卡顿解决方案,滑动冲突解决方案
- android 沉浸式布局学习
- 【Android學習專題】視覺介面篇:Android布局及属性归总(查询用)
- Android(安卓)2.1学习笔记(二)
- Android布局整理
- android 动态设置控件的高度,使用对应布局中的dp值
- android 相对布局RelativeLayout
- Android(安卓)Material Design控件之FloatingActionButton
- 在代码中设置RelativeLayout布局中标签的android:layout_toLeftO