Skip to content

Commit cd875f6

Browse files
committed
2.2.0版本发布
1 parent 313aef1 commit cd875f6

30 files changed

Lines changed: 1874 additions & 729 deletions

README.md

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,23 @@
22

33
[![](https://img.shields.io/github/release/crazysunj/CardSlideView.svg) ](https://github.com/crazysunj/CardSlideView/releases)
44

5-
一行代码实现ViewPager卡片效果,支持无限循环,支持正常与卡片之间的切换,随意变换,2.x版本采用RecyclerView实现
6-
7-
想实现轮播效果的同学,可以参考[CrazyDaily](https://github.com/crazysunj/CrazyDaily "https://github.com/crazysunj/CrazyDaily")开源项目首页实现。
5+
一行代码实现ViewPager卡片效果,比ViewPager2更强大,底层同样是RecyclerView
86

97
## 效果
108

11-
![](https://github.com/crazysunj/crazysunj.github.io/blob/master/img/vp_card5.gif)
9+
![](https://github.com/crazysunj/crazysunj.github.io/blob/master/img/card_slide_2_2_0.gif)
10+
11+
## 功能
12+
* ItemDecoration
13+
* 可设item之间间距,可做到叠加
14+
* 可设各个view自身的padding和margin
15+
* 横竖两个方向
16+
* 无限循环
17+
* page和linear两种滑动方式
18+
* 百分比适配,但只会根据宽高其中一个维度适配
19+
* 非无循环模式边界支持回弹,可动态设置是否开启
20+
21+
想实现轮播效果的同学,1.x版本可以参考[CrazyDaily](https://github.com/crazysunj/CrazyDaily "https://github.com/crazysunj/CrazyDaily")开源项目首页实现,2.x版本可以参考本项目实例,还有炫酷的指示器、3D旋转和倒影效果哦
1222

1323
## 用法
1424

README_2.0.md

Lines changed: 117 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,151 @@
11
## 2.x
22

3+
### 实例
34
```
45
CardSlideView<MyBean> slideView = (CardSlideView) findViewById(R.id.slide_view);
5-
slideView.bind(list, new MyCardHolder());
6+
slideView.bind(list, new NormalCardHolder());
67
```
78

89

910
```
10-
static class MyCardHolder implements CardHolder<MyBean> {
11+
static class NormalCardHolder implements CardHolder<MyBean> {
1112
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+
}
1617
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);
2823
}
24+
}
2925
```
3026

27+
### 方法简介
3128
```
32-
// 获取当前选中下标
29+
// 获取当前选中下标,滑动过程中并不会改动
3330
int currentItem = slideView.getCurrentItem();
31+
// 获取当前距离中心最近的view,这个是实时的
32+
int centerView = slideView.getCenterView();
3433
// 获取当前的方向
3534
int orientation = slideView.getOrientation();
36-
// 设置变换效果,默认是缩放的,最低0.8,实现PageTransformer接口即可
37-
slideView.setItemTransformer(new MyScale());
35+
// 设置变换效果,默认是缩放+透明度,最低0.8,实现PageTransformer接口即可
36+
slideView.setItemTransformer(new DefaultTransformer());
3837
39-
static class MyScale implements PageTransformer {
38+
public class DefaultTransformer implements PageTransformer {
39+
40+
public DefaultTransformer() {
41+
}
4042
4143
@Override
4244
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);
4568
}
4669
}
47-
// 设置卡片的滑动效果,默认是page,类似于viewPager,库里除了提供这个效果,还提供了快速线性滑动
48-
slideView.setSnapHelper(new CardLinearSnapHelper());
4970
// 设置是否无限循环
5071
slideView.setLooper(true);
51-
// 设置page滑动监听,监听方式跟viewPager类似,在惯性滑动时不会回调
72+
// 设置page滑动监听,监听方式跟viewPager类似,在滑动时不会回调
5273
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>
53143
```
54144

55145
## gradle依赖
56146

57147
```
58-
implementation 'com.crazysunj:cardslideview:2.0.0'
148+
implementation 'com.crazysunj:cardslideview:2.2.0'
59149
同时还需要依赖自己的v4包和recyclerview包,androidx哦
60150
```
61151

app/build.gradle

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
apply plugin: 'com.android.application'
22

33
android {
4-
compileSdkVersion 28
4+
compileSdkVersion 30
55
defaultConfig {
66
applicationId "com.crazysunj.cardslide"
77
minSdkVersion 15
8-
targetSdkVersion 28
8+
targetSdkVersion 30
99
versionCode 1
1010
versionName "1.0"
1111
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -24,21 +24,15 @@ android {
2424

2525
dependencies {
2626
implementation fileTree(include: ['*.jar'], dir: 'libs')
27-
// implementation project(':cardslideview')
28-
implementation 'com.crazysunj:cardslideview:2.0.0'
29-
implementation 'androidx.appcompat:appcompat:1.0.0'
30-
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
31-
implementation('com.github.bumptech.glide:glide:4.7.1') {
32-
exclude group: "com.android.support"
33-
}
27+
implementation project(':cardslideview')
28+
implementation 'com.crazysunj:cardslideview:2.2.0'
29+
// implementation 'androidx.appcompat:appcompat:1.2.0'
30+
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
31+
implementation 'com.github.bumptech.glide:glide:4.11.0'
3432
implementation('jp.wasabeef:glide-transformations:3.3.0') {
3533
exclude group: 'com.github.bumptech.glide', module: 'glide'
3634
}
37-
testImplementation 'junit:junit:4.12'
38-
testImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4'
39-
annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
40-
debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5.4'
41-
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4'
42-
implementation 'androidx.cardview:cardview:1.0.0'
43-
implementation 'androidx.recyclerview:recyclerview:1.0.0'
35+
testImplementation 'junit:junit:4.13'
36+
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
37+
implementation 'androidx.recyclerview:recyclerview:1.1.0'
4438
}

app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
android:roundIcon="@mipmap/ic_launcher_round"
1313
android:supportsRtl="true"
1414
android:theme="@style/AppTheme">
15-
<activity android:name=".MainActivity">
15+
<activity android:name=".MainActivity"
16+
android:windowSoftInputMode="adjustPan">
1617
<intent-filter>
1718
<action android:name="android.intent.action.MAIN" />
1819

app/src/main/java/com/crazysunj/cardslide/APP.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import android.app.Application;
44

5-
import com.squareup.leakcanary.LeakCanary;
6-
75
/**
86
* description
97
* <p>
@@ -15,9 +13,5 @@ public class APP extends Application {
1513
@Override
1614
public void onCreate() {
1715
super.onCreate();
18-
if (LeakCanary.isInAnalyzerProcess(this)) {
19-
return;
20-
}
21-
LeakCanary.install(this);
2216
}
2317
}

0 commit comments

Comments
 (0)