|
1 | 1 | ## 2.x |
2 | 2 |
|
| 3 | +### 实例 |
3 | 4 | ``` |
4 | 5 | CardSlideView<MyBean> slideView = (CardSlideView) findViewById(R.id.slide_view); |
5 | | -slideView.bind(list, new MyCardHolder()); |
| 6 | +slideView.bind(list, new NormalCardHolder()); |
6 | 7 | ``` |
7 | 8 |
|
8 | 9 |
|
9 | 10 | ``` |
10 | | -static class MyCardHolder implements CardHolder<MyBean> { |
| 11 | +static class NormalCardHolder implements CardHolder<MyBean> { |
11 | 12 |
|
12 | | - @Override |
13 | | - public View onCreateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) { |
14 | | - return inflater.inflate(R.layout.item, container, false); |
15 | | - } |
| 13 | + @Override |
| 14 | + public View onCreateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) { |
| 15 | + return inflater.inflate(R.layout.item, container, false); |
| 16 | + } |
16 | 17 |
|
17 | | - @Override |
18 | | - public void onBindView(@NonNull CardViewHolder holder, MyBean data, int position) { |
19 | | - Log.e("MainActivity", "onBindView---data:" + data + "position:" + position); |
20 | | - ImageView imageView = holder.getView(R.id.image); |
21 | | - final String img = data.getImg(); |
22 | | - Glide.with(imageView.getContext()).load(img).apply(new RequestOptions().dontAnimate()).into(imageView); |
23 | | - holder.itemView.setOnClickListener(v -> { |
24 | | - Log.e("MainActivity", "setOnClickListener---data:" + data + "position:" + position); |
25 | | - TestActivity.start(v.getContext(), img); |
26 | | - }); |
27 | | - } |
| 18 | + @Override |
| 19 | + public void onBindView(@NonNull CardViewHolder holder, MyBean data, int position) { |
| 20 | + ImageView imageView = holder.getView(R.id.image); |
| 21 | + final String img = data.getImg(); |
| 22 | + Glide.with(imageView.getContext()).load(img).apply(new RequestOptions().dontAnimate().placeholder(new ColorDrawable(Color.WHITE))).into(imageView); |
28 | 23 | } |
| 24 | +} |
29 | 25 | ``` |
30 | 26 |
|
| 27 | +### 方法简介 |
31 | 28 | ``` |
32 | | -// 获取当前选中下标 |
| 29 | +// 获取当前选中下标,滑动过程中并不会改动 |
33 | 30 | int currentItem = slideView.getCurrentItem(); |
| 31 | +// 获取当前距离中心最近的view,这个是实时的 |
| 32 | +int centerView = slideView.getCenterView(); |
34 | 33 | // 获取当前的方向 |
35 | 34 | int orientation = slideView.getOrientation(); |
36 | | -// 设置变换效果,默认是缩放的,最低0.8,实现PageTransformer接口即可 |
37 | | -slideView.setItemTransformer(new MyScale()); |
| 35 | +// 设置变换效果,默认是缩放+透明度,最低0.8,实现PageTransformer接口即可 |
| 36 | +slideView.setItemTransformer(new DefaultTransformer()); |
38 | 37 |
|
39 | | -static class MyScale implements PageTransformer { |
| 38 | +public class DefaultTransformer implements PageTransformer { |
| 39 | +
|
| 40 | + public DefaultTransformer() { |
| 41 | + } |
40 | 42 |
|
41 | 43 | @Override |
42 | 44 | public void transformPage(@NonNull View view, float offsetPercent, int orientation) { |
43 | | - view.setScaleX(1.0f); |
44 | | - view.setScaleY(1.0f); |
| 45 | + if (orientation == LinearLayout.HORIZONTAL) { |
| 46 | + if (offsetPercent > 0) { |
| 47 | + view.setPivotX(view.getWidth()); |
| 48 | + view.setPivotY(view.getHeight() / 2.f); |
| 49 | + } else { |
| 50 | + view.setPivotX(0); |
| 51 | + view.setPivotY(view.getHeight() / 2.f); |
| 52 | + } |
| 53 | + } else { |
| 54 | + if (offsetPercent > 0) { |
| 55 | + view.setPivotX(view.getWidth() / 2.f); |
| 56 | + view.setPivotY(view.getHeight()); |
| 57 | + } else { |
| 58 | + view.setPivotX(view.getWidth() / 2.f); |
| 59 | + view.setPivotY(0); |
| 60 | + } |
| 61 | + } |
| 62 | + final float finalPercent = 1 - Math.min(Math.abs(offsetPercent), 2.f) / 2.f; |
| 63 | + float scale = 0.8f + 0.2f * finalPercent; |
| 64 | + view.setScaleX(scale); |
| 65 | + view.setScaleY(scale); |
| 66 | + final float alpha = (float) Math.pow(finalPercent, 0.8); |
| 67 | + view.setAlpha(alpha); |
45 | 68 | } |
46 | 69 | } |
47 | | -// 设置卡片的滑动效果,默认是page,类似于viewPager,库里除了提供这个效果,还提供了快速线性滑动 |
48 | | -slideView.setSnapHelper(new CardLinearSnapHelper()); |
49 | 70 | // 设置是否无限循环 |
50 | 71 | slideView.setLooper(true); |
51 | | -// 设置page滑动监听,监听方式跟viewPager类似,在惯性滑动时不会回调 |
| 72 | +// 设置page滑动监听,监听方式跟viewPager类似,在滑动时不会回调 |
52 | 73 | slideView.setOnPageChangeListener(new MyPageChangeListener()); |
| 74 | +
|
| 75 | +public interface OnPageChangeListener { |
| 76 | + void onPageSelected(int position); |
| 77 | +} |
| 78 | +
|
| 79 | +// 支持RecyclerView的ItemDecoration |
| 80 | +public RecyclerView.ItemDecoration getItemDecorationAt(int index); |
| 81 | +
|
| 82 | +// 获取绑定的数据 |
| 83 | +public List<T> getData(); |
| 84 | +
|
| 85 | +// 获取总item数 |
| 86 | +public int getItemCount(); |
| 87 | +
|
| 88 | +// 获取对应下标ItemDecoration |
| 89 | +public RecyclerView.ItemDecoration getItemDecorationAt(int index); |
| 90 | +
|
| 91 | +// 获取ItemDecoration已设置总数 |
| 92 | +public int getItemDecorationCount(); |
| 93 | +
|
| 94 | +// 获取对应view在列表中的具体下标 |
| 95 | +public int getPosition(@NonNull View view); |
| 96 | +
|
| 97 | +// 移除对应ItemDecoration |
| 98 | +public void removeItemDecoration(@NonNull RecyclerView.ItemDecoration decor); |
| 99 | +public void removeItemDecorationAt(int index); |
| 100 | +
|
| 101 | +// 设置横竖方向是否可滑动 |
| 102 | +public void setCanScrollHorizontally(boolean canScrollHorizontally); |
| 103 | +public void setCanScrollVertically(boolean canScrollVertically); |
| 104 | +
|
| 105 | +// 切到对应下标,smoothScroll为true带动画 |
| 106 | +public void setCurrentItem(int item, boolean smoothScroll); |
| 107 | +
|
| 108 | +// 设置每个item的宽高比 |
| 109 | +public void setItemRate(float itemRate); |
| 110 | +
|
| 111 | +// 设置中间item距离两边空隙的距离,为item宽度的百分比 |
| 112 | +public void setSideOffsetPercent(float sideOffsetPercent); |
| 113 | +
|
| 114 | +// 设置item点击事件,如果点击非中间item,那么点击item将会移动到中间 |
| 115 | +slideView.setOnPageItemClickListener(new MyPageItemClickListener()); |
| 116 | +
|
| 117 | +public interface OnPageItemClickListener<T> { |
| 118 | + void onItemClick(View view, T data, int position); |
| 119 | +} |
| 120 | +
|
| 121 | +#BitmapHelper |
| 122 | +// 支持bitmap倒影转换,建议放在子线程 |
| 123 | +public static Bitmap convertReflection(@NonNull Bitmap originalImage, int viewWidth, int viewHeight) ; |
| 124 | +``` |
| 125 | + |
| 126 | +### 属性简介 |
| 127 | +``` |
| 128 | +// item间距百分比,以item宽度为基准,范围-1~1 |
| 129 | +<attr name="card_item_margin_percent" format="float" /> |
| 130 | +// 是否支持无线循环 |
| 131 | +<attr name="card_loop" format="boolean" /> |
| 132 | +// 是否支持回弹效果,只在非无限循环下生效 |
| 133 | +<attr name="card_rebound" format="boolean" /> |
| 134 | +// 中间item两边留边距离百分比,以item宽度为基准,范围0-1 |
| 135 | +<attr name="card_side_offset_percent" format="float" /> |
| 136 | +// item的宽高比 |
| 137 | +<attr name="card_item_rate" format="float" /> |
| 138 | +// 滑动模式,page-类似ViewPager,linear-类似平时RecyclerView(有作滑动优化) |
| 139 | +<attr name="card_page_mode" format="enum"> |
| 140 | + <enum name="linear" value="0" /> |
| 141 | + <enum name="page" value="1" /> |
| 142 | +</attr> |
53 | 143 | ``` |
54 | 144 |
|
55 | 145 | ## gradle依赖 |
56 | 146 |
|
57 | 147 | ``` |
58 | | -implementation 'com.crazysunj:cardslideview:2.0.0' |
| 148 | +implementation 'com.crazysunj:cardslideview:2.2.0' |
59 | 149 | 同时还需要依赖自己的v4包和recyclerview包,androidx哦 |
60 | 150 | ``` |
61 | 151 |
|
|
0 commit comments