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);    }}

更多相关文章

  1. RecyclerView嵌套ScrollView,滑动卡顿解决方案,滑动冲突解决方案
  2. android 沉浸式布局学习
  3. 【Android學習專題】視覺介面篇:Android布局及属性归总(查询用)
  4. Android(安卓)2.1学习笔记(二)
  5. Android布局整理
  6. android 动态设置控件的高度,使用对应布局中的dp值
  7. android 相对布局RelativeLayout
  8. Android(安卓)Material Design控件之FloatingActionButton
  9. 在代码中设置RelativeLayout布局中标签的android:layout_toLeftO

随机推荐

  1. Android系统通过手机USB进行网络共享设置
  2. 创建一个ArcGIS for Android(安卓)新项目
  3. Android(安卓)屏幕旋转 处理 AsyncTask
  4. android 按钮
  5. Windows系统下的Android开发环境搭建
  6. What Android(安卓)Can Learn From the i
  7. Android单元测试遇到的问题
  8. Android入门第十二篇之Gallery
  9. Android获取应用程序的版本名称和版本号
  10. Linux 下Android(安卓)开发环境搭建 ---Cent