1717
1818import android .content .Context ;
1919import android .content .res .TypedArray ;
20+ import android .support .annotation .IntDef ;
2021import android .support .annotation .NonNull ;
2122import android .support .v4 .app .FragmentManager ;
23+ import android .support .v4 .view .PagerAdapter ;
2224import android .support .v4 .view .ViewPager ;
2325import android .util .AttributeSet ;
2426import android .util .DisplayMetrics ;
2527import android .util .TypedValue ;
2628
2729import java .io .Serializable ;
30+ import java .lang .annotation .Retention ;
31+ import java .lang .annotation .RetentionPolicy ;
2832import java .util .ArrayList ;
2933import java .util .List ;
3034
3539 */
3640public 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