Skip to content

Commit 937dcc9

Browse files
committed
1.2.0
1 parent b88d0c5 commit 937dcc9

10 files changed

Lines changed: 154 additions & 22 deletions

File tree

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# CardSlideView
2-
一行代码实现ViewPager卡片效果,支持无限循环
2+
一行代码实现ViewPager卡片效果,支持无限循环,支持正常与卡片之间的切换
33

44
## 效果
55

@@ -34,10 +34,12 @@ public class MyCardHandler implements CardHandler<String> {
3434

3535
详细介绍戳[这里](http://crazysunj.com/2017/06/25/%E4%B8%80%E8%A1%8C%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0ViewPager%E5%8D%A1%E7%89%87%E6%95%88%E6%9E%9C/)
3636

37+
具体参考demo
38+
3739
## gradle依赖
3840

3941
```
40-
compile 'com.crazysunj:cardslideview:1.1.1'
42+
compile 'com.crazysunj:cardslideview:1.2.0'
4143
```
4244

4345
## 感谢

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

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

33
import android.os.Bundle;
44
import android.support.v7.app.AppCompatActivity;
5-
import android.util.Log;
5+
import android.view.View;
66

77
import com.crazysunj.cardslideview.CardViewPager;
88

@@ -80,6 +80,8 @@ public class MainActivity extends AppCompatActivity {
8080
"https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1241938828,3177192306&fm=26&gp=0.jpg"};
8181
private CardViewPager viewPager;
8282

83+
private boolean isCard = true;
84+
8385
@Override
8486
protected void onCreate(Bundle savedInstanceState) {
8587
super.onCreate(savedInstanceState);
@@ -92,12 +94,34 @@ protected void onCreate(Bundle savedInstanceState) {
9294
list.add(new MyBean("https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=3093044513,96496376&fm=26&gp=0.jpg"));
9395
list.add(new MyBean("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3210647450,3365972530&fm=26&gp=0.jpg"));
9496
list.add(new MyBean("https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1152354189,4075004834&fm=26&gp=0.jpg"));
95-
list.add(new MyBean("https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1241938828,3177192306&fm=26&gp=0.jpg"));
96-
list.add(new MyBean("https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=934278520,495630521&fm=26&gp=0.jpg"));
97-
list.add(new MyBean("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=800274749,3560269987&fm=26&gp=0.jpg"));
98-
Log.d("MainActivity", "list:" + list);
97+
// list.add(new MyBean("https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1241938828,3177192306&fm=26&gp=0.jpg"));
98+
// list.add(new MyBean("https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=934278520,495630521&fm=26&gp=0.jpg"));
99+
// list.add(new MyBean("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=800274749,3560269987&fm=26&gp=0.jpg"));
99100
viewPager.bind(getSupportFragmentManager(), new MyCardHandler(), list);
100-
101101
// viewPager.bind(getSupportFragmentManager(), new MyCardHandler(), Arrays.asList(imageArray));
102102
}
103+
104+
public void onClick(View view) {
105+
if (isCard) {
106+
isCard = false;
107+
switchNormal();
108+
} else {
109+
isCard = true;
110+
switchCard();
111+
}
112+
}
113+
114+
private void switchNormal() {
115+
viewPager.setCardTransformer(0, 0);
116+
viewPager.setCardPadding(0);
117+
viewPager.setCardMargin(0);
118+
viewPager.notifyUI(CardViewPager.MODE_NORMAL);
119+
}
120+
121+
private void switchCard() {
122+
viewPager.setCardTransformer(180, 0.38f);
123+
viewPager.setCardPadding(60);
124+
viewPager.setCardMargin(40);
125+
viewPager.notifyUI(CardViewPager.MODE_CARD);
126+
}
103127
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import com.bumptech.glide.Glide;
99
import com.crazysunj.cardslideview.CardHandler;
10+
import com.crazysunj.cardslideview.CardViewPager;
1011
import com.crazysunj.cardslideview.ElasticCardView;
1112

1213
/**
@@ -18,12 +19,13 @@
1819
public class MyCardHandler implements CardHandler<MyBean> {
1920

2021
@Override
21-
public View onBind(final Context context, final MyBean data, final int position) {
22+
public View onBind(final Context context, final MyBean data, final int position, @CardViewPager.TransformerMode int mode) {
2223
View view = View.inflate(context, R.layout.item, null);
2324
ImageView imageView = (ImageView) view.findViewById(R.id.image);
2425
ElasticCardView cardView = (ElasticCardView) view.findViewById(R.id.cardview);
25-
cardView.setPreventCornerOverlap(false);
26-
cardView.setUseCompatPadding(false);
26+
final boolean isCard = mode == CardViewPager.MODE_CARD;
27+
cardView.setPreventCornerOverlap(isCard);
28+
cardView.setUseCompatPadding(isCard);
2729
final String img = data.getImg();
2830
Glide.with(context).load(img).into(imageView);
2931
view.setOnClickListener(new View.OnClickListener() {

app/src/main/res/layout/activity_main.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,10 @@
1313
android:layout_height="match_parent"
1414
app:card_loop="true" />
1515

16+
<Button
17+
android:layout_width="match_parent"
18+
android:layout_height="wrap_content"
19+
android:onClick="onClick"
20+
android:text="变换" />
21+
1622
</FrameLayout>

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ ext {
2323
userOrg = 'twsunj'
2424
groupId = 'com.crazysunj'
2525
uploadName = 'CardSlideView'
26-
publishVersion = '1.1.1'
26+
publishVersion = '1.2.0'
2727
desc = 'CardSlideView For Android'
2828
website = 'https://github.com/crazysunj/CardSlideView'
2929
licences = ['Apache-2.0']

cardslideview/src/main/java/com/crazysunj/cardslideview/BaseCardItem.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ public class BaseCardItem<T> extends Fragment {
3232

3333
protected Context mContext;
3434

35+
@CardViewPager.TransformerMode
36+
int currentMode;
37+
3538
@Override
3639
public void onAttach(Context context) {
3740
super.onAttach(context);

cardslideview/src/main/java/com/crazysunj/cardslideview/CardHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,5 @@
2727
*/
2828
public interface CardHandler<T> extends Serializable {
2929

30-
View onBind(Context context, T data, int position);
30+
View onBind(Context context, T data, int position, @CardViewPager.TransformerMode int mode);
3131
}

cardslideview/src/main/java/com/crazysunj/cardslideview/CardItem.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,18 @@
3030
*/
3131
public class CardItem<T extends Serializable> extends BaseCardItem<T> {
3232

33+
@SuppressWarnings("unchecked")
3334
@Nullable
3435
@Override
3536
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
36-
3737
Bundle bundle = getArguments();
3838
CardHandler<T> handler = (CardHandler<T>) bundle.getSerializable(ARGUMENTS_HANDLER);
3939
T data = (T) bundle.getSerializable(ARGUMENTS_DATA);
4040
int position = bundle.getInt(ARGUMENTS_POSITION, 0);
4141
if (handler == null) {
4242
throw new RuntimeException("please bind the handler !");
4343
}
44-
return handler.onBind(mContext, data, position);
44+
return handler.onBind(mContext, data, position, currentMode);
4545
}
4646

4747
public void bindData(T data, int position) {
@@ -53,4 +53,5 @@ public void bindData(T data, int position) {
5353
bundle.putSerializable(ARGUMENTS_DATA, data);
5454
bundle.putInt(ARGUMENTS_POSITION, position);
5555
}
56+
5657
}

cardslideview/src/main/java/com/crazysunj/cardslideview/CardPagerAdapter.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,13 @@ class CardPagerAdapter extends FragmentStatePagerAdapter {
4040
mIsLoop = isLoop;
4141
}
4242

43+
void setCardMode(@CardViewPager.TransformerMode int mode) {
44+
if (mCardItems == null || mCardItems.isEmpty()) return;
45+
for (CardItem cardItem : mCardItems) {
46+
cardItem.currentMode = mode;
47+
}
48+
}
49+
4350
@Override
4451
public Fragment getItem(int position) {
4552
return mCardItems.get(position);
@@ -62,7 +69,11 @@ public void destroyItem(ViewGroup container, int position, Object object) {
6269
int pos = viewPager.getCurrentItem();
6370
int i = pos % getRealCount();
6471
int j = position % getRealCount();
65-
if (j >= i - 2 && j <= i + 2) {
72+
if (viewPager.isNotify) {
73+
super.destroyItem(container, j, object);
74+
return;
75+
}
76+
if (viewPager.isCardMode() && j >= i - 2 && j <= i + 2) {
6677
return;
6778
}
6879
super.destroyItem(container, j, object);

cardslideview/src/main/java/com/crazysunj/cardslideview/CardViewPager.java

Lines changed: 89 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,18 @@
1717

1818
import android.content.Context;
1919
import android.content.res.TypedArray;
20+
import android.support.annotation.IntDef;
2021
import android.support.annotation.NonNull;
2122
import android.support.v4.app.FragmentManager;
23+
import android.support.v4.view.PagerAdapter;
2224
import android.support.v4.view.ViewPager;
2325
import android.util.AttributeSet;
2426
import android.util.DisplayMetrics;
2527
import android.util.TypedValue;
2628

2729
import java.io.Serializable;
30+
import java.lang.annotation.Retention;
31+
import java.lang.annotation.RetentionPolicy;
2832
import java.util.ArrayList;
2933
import java.util.List;
3034

@@ -35,10 +39,28 @@
3539
*/
3640
public class CardViewPager extends ViewPager {
3741

42+
private static final int CACHE_COPUNT = 6;
43+
44+
public static final int MODE_CARD = 0;
45+
public static final int MODE_NORMAL = 1;
46+
47+
@IntDef({MODE_CARD, MODE_NORMAL})
48+
@Retention(RetentionPolicy.SOURCE)
49+
public @interface TransformerMode {
50+
}
51+
3852
private int mMaxOffset;
3953
private float mScaleRate;
4054
private boolean mIsLoop = false;
55+
private int mCardPaddingLeft;
56+
private int mCardPaddingTop;
57+
private int mCardPaddingRight;
58+
private int mCardPaddingBottom;
4159
private CardTransformer mTransformer;
60+
@TransformerMode
61+
private int mCurrentMode = MODE_CARD;
62+
63+
boolean isNotify;
4264

4365
public CardViewPager(Context context) {
4466
this(context, null);
@@ -54,7 +76,11 @@ public CardViewPager(Context context, AttributeSet attrs) {
5476
int padding = typedArray
5577
.getDimensionPixelOffset(R.styleable.CardViewPager_card_padding,
5678
(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 60, displayMetrics));
57-
setPadding(getPaddingLeft() + padding, getPaddingTop(), getPaddingRight() + padding, getPaddingBottom());
79+
mCardPaddingLeft = getPaddingLeft();
80+
mCardPaddingTop = getPaddingTop();
81+
mCardPaddingRight = getPaddingRight();
82+
mCardPaddingBottom = getPaddingBottom();
83+
setPadding(mCardPaddingLeft + padding, mCardPaddingTop, mCardPaddingRight + padding, mCardPaddingBottom);
5884

5985
int margin = typedArray
6086
.getDimensionPixelOffset(R.styleable.CardViewPager_card_margin,
@@ -78,12 +104,62 @@ public CardViewPager(Context context, AttributeSet attrs) {
78104
* @param maxOffset 移动偏移量
79105
* @param scaleRate 缩放比例
80106
*/
81-
public void setCardTransformer(int maxOffset, float scaleRate) {
82-
mTransformer = new CardTransformer(maxOffset, scaleRate);
107+
public void setCardTransformer(float maxOffset, float scaleRate) {
108+
int cardMaxOffset = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, maxOffset, getResources().getDisplayMetrics());
109+
mTransformer = new CardTransformer(cardMaxOffset, scaleRate);
83110
setPageTransformer(false, mTransformer);
84111
}
85112

113+
/**
114+
* 设置卡片左右padding
115+
*
116+
* @param padding 值,自动转dp
117+
*/
118+
public void setCardPadding(float padding) {
119+
int cardPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, padding, getResources().getDisplayMetrics());
120+
setPadding(mCardPaddingLeft + cardPadding, mCardPaddingTop, mCardPaddingRight + cardPadding, mCardPaddingBottom);
121+
}
122+
123+
/**
124+
* 设置卡片margin
125+
*
126+
* @param margin 值,自动转dp
127+
*/
128+
public void setCardMargin(float margin) {
129+
int cardMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, margin, getResources().getDisplayMetrics());
130+
setPageMargin(cardMargin);
131+
}
132+
133+
/**
134+
* 根据模式刷新通知UI刷新
135+
*
136+
* @param mode 模式
137+
*/
138+
public void notifyUI(@TransformerMode int mode) {
139+
mCurrentMode = mode;
140+
isNotify = true;
141+
CardPagerAdapter adapter = (CardPagerAdapter) getAdapter();
142+
adapter.setCardMode(mCurrentMode);
143+
setAdapter(adapter);
144+
isNotify = false;
145+
}
146+
147+
boolean isCardMode() {
148+
return mCurrentMode == MODE_CARD;
149+
}
86150

151+
public int getCurrentMode() {
152+
return mCurrentMode;
153+
}
154+
155+
/**
156+
* 绑定数据源
157+
*
158+
* @param fm FragmentManager
159+
* @param handler 数据处理类
160+
* @param data 数据源
161+
* @param <T> 泛型,必须实现Serializable
162+
*/
87163
public <T extends Serializable> void bind(FragmentManager fm, CardHandler<T> handler, List<T> data) {
88164
List<CardItem> cardItems = getCardItems(handler, data, mIsLoop);
89165
if (mTransformer == null) {
@@ -98,9 +174,8 @@ public <T extends Serializable> void bind(FragmentManager fm, CardHandler<T> han
98174
private <T extends Serializable> List<CardItem> getCardItems(CardHandler<T> handler, List<T> data, boolean isLoop) {
99175
List<CardItem> cardItems = new ArrayList<CardItem>();
100176
int dataSize = data.size();
101-
int cacheCount = 6;
102-
boolean isExpand = isLoop && dataSize < cacheCount;
103-
int size = isExpand ? cacheCount : dataSize;
177+
boolean isExpand = isLoop && dataSize < CACHE_COPUNT;
178+
int size = isExpand ? CACHE_COPUNT : dataSize;
104179
for (int i = 0; i < size; i++) {
105180
int position = isExpand ? i % dataSize : i;
106181
T t = data.get(position);
@@ -111,4 +186,12 @@ private <T extends Serializable> List<CardItem> getCardItems(CardHandler<T> hand
111186
}
112187
return cardItems;
113188
}
189+
190+
@Override
191+
public void setAdapter(PagerAdapter adapter) {
192+
if (!(adapter instanceof CardPagerAdapter)) {
193+
throw new RuntimeException("please set CardPagerAdapter!");
194+
}
195+
super.setAdapter(adapter);
196+
}
114197
}

0 commit comments

Comments
 (0)