mRollPagerViewWeakReference;
160 |
161 | public WeakTimerTask(RollPagerView mRollPagerView) {
162 | this.mRollPagerViewWeakReference = new WeakReference<>(mRollPagerView);
163 | }
164 |
165 | @Override
166 | public void run() {
167 | RollPagerView rollPagerView = mRollPagerViewWeakReference.get();
168 | if (rollPagerView!=null){
169 | if(rollPagerView.isShown() && System.currentTimeMillis()-rollPagerView.mRecentTouchTime>rollPagerView.delay){
170 | rollPagerView.mHandler.sendEmptyMessage(0);
171 | }
172 | }else{
173 | cancel();
174 | }
175 | }
176 | }
177 |
178 | /**
179 | * 开始播放
180 | * 仅当view正在显示 且 触摸等待时间过后 播放
181 | */
182 | private void startPlay(){
183 | if(delay<=0||mAdapter==null||mAdapter.getCount()<=1){
184 | return;
185 | }
186 | if (timer!=null){
187 | timer.cancel();
188 | }
189 | timer = new Timer();
190 | //用一个timer定时设置当前项为下一项
191 | timer.schedule(new WeakTimerTask(this), delay, delay);
192 | }
193 |
194 | private void stopPlay(){
195 | if (timer!=null){
196 | timer.cancel();
197 | timer = null;
198 | }
199 | }
200 |
201 |
202 | public void setHintViewDelegate(HintViewDelegate delegate){
203 | this.mHintViewDelegate = delegate;
204 | }
205 |
206 |
207 | private void initHint(HintView hintview){
208 | if(mHintView!=null){
209 | removeView(mHintView);
210 | }
211 |
212 | if(hintview == null||!(hintview instanceof HintView)){
213 | return;
214 | }
215 |
216 | mHintView = (View) hintview;
217 | loadHintView();
218 | }
219 |
220 | /**
221 | * 加载hintview的容器
222 | */
223 | private void loadHintView(){
224 | addView(mHintView);
225 | mHintView.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
226 | LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
227 | lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
228 | ((View) mHintView).setLayoutParams(lp);
229 |
230 | GradientDrawable gd = new GradientDrawable();
231 | gd.setColor(color);
232 | gd.setAlpha(alpha);
233 | mHintView.setBackgroundDrawable(gd);
234 |
235 | mHintViewDelegate.initView(mAdapter == null ? 0 : mAdapter.getCount(), gravity, (HintView) mHintView);
236 | }
237 |
238 |
239 | /**
240 | * 设置viewager滑动动画持续时间
241 | * @param during
242 | */
243 | public void setAnimationDurtion(final int during){
244 | try {
245 | // viePager平移动画事件
246 | Field mField = ViewPager.class.getDeclaredField("mScroller");
247 | mField.setAccessible(true);
248 | Scroller mScroller = new Scroller(getContext(),
249 | // 动画效果与ViewPager的一致
250 | new Interpolator() {
251 | public float getInterpolation(float t) {
252 | t -= 1.0f;
253 | return t * t * t * t * t + 1.0f;
254 | }
255 | }) {
256 |
257 | @Override
258 | public void startScroll(int startX, int startY, int dx,
259 | int dy, int duration) {
260 | // 如果手工滚动,则加速滚动
261 | if (System.currentTimeMillis() - mRecentTouchTime > delay) {
262 | duration = during;
263 | } else {
264 | duration /= 2;
265 | }
266 | super.startScroll(startX, startY, dx, dy, duration);
267 | }
268 |
269 | @Override
270 | public void startScroll(int startX, int startY, int dx,
271 | int dy) {
272 | super.startScroll(startX, startY, dx, dy,during);
273 | }
274 | };
275 | mField.set(mViewPager, mScroller);
276 | } catch (NoSuchFieldException e) {
277 | e.printStackTrace();
278 | } catch (IllegalArgumentException e) {
279 | e.printStackTrace();
280 | } catch (IllegalAccessException e) {
281 | e.printStackTrace();
282 | }
283 | }
284 |
285 | public void setPlayDelay(int delay){
286 | this.delay = delay;
287 | startPlay();
288 | }
289 |
290 |
291 | public void pause(){
292 | stopPlay();
293 | }
294 |
295 | public void resume(){
296 | startPlay();
297 | }
298 |
299 | public boolean isPlaying(){
300 | return timer!=null;
301 | }
302 |
303 |
304 | public void setOnItemClickListener(OnItemClickListener listener){
305 | this.mOnItemClickListener = listener;
306 | }
307 |
308 | /**
309 | * 设置提示view的位置
310 | *
311 | */
312 | public void setHintPadding(int left,int top,int right,int bottom){
313 | paddingLeft = left;
314 | paddingTop = top;
315 | paddingRight = right;
316 | paddingBottom = bottom;
317 | mHintView.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
318 | }
319 |
320 | /**
321 | * 设置提示view的透明度
322 | * @param alpha 0为全透明 255为实心
323 | */
324 | public void setHintAlpha(int alpha){
325 | this.alpha = alpha;
326 | initHint((HintView)mHintView);
327 | }
328 |
329 | /**
330 | * 支持自定义hintview
331 | * 只需new一个实现HintView的View传进来
332 | * 会自动将你的view添加到本View里面。重新设置LayoutParams。
333 | * @param hintview
334 | */
335 | public void setHintView(HintView hintview){
336 |
337 | if (mHintView != null) {
338 | removeView(mHintView);
339 | }
340 | this.mHintView = (View) hintview;
341 | if (hintview!=null&&hintview instanceof View){
342 | initHint(hintview);
343 | }
344 | }
345 |
346 | /**
347 | * 取真正的Viewpager
348 | * @return
349 | */
350 | public ViewPager getViewPager() {
351 | return mViewPager;
352 | }
353 |
354 | /**
355 | * 设置Adapter
356 | * @param adapter
357 | */
358 | public void setAdapter(PagerAdapter adapter){
359 | adapter.registerDataSetObserver(new JPagerObserver());
360 | mViewPager.setAdapter(adapter);
361 | mViewPager.addOnPageChangeListener(this);
362 | mAdapter = adapter;
363 | dataSetChanged();
364 | }
365 |
366 | /**
367 | * 用来实现adapter的notifyDataSetChanged通知HintView变化
368 | */
369 | private class JPagerObserver extends DataSetObserver {
370 | @Override
371 | public void onChanged() {
372 | dataSetChanged();
373 | }
374 |
375 | @Override
376 | public void onInvalidated() {
377 | dataSetChanged();
378 | }
379 | }
380 |
381 | private void dataSetChanged(){
382 | if(mHintView!=null) {
383 | mHintViewDelegate.initView(mAdapter.getCount(), gravity, (HintView) mHintView);
384 | mHintViewDelegate.setCurrentPosition(mViewPager.getCurrentItem(), (HintView) mHintView);
385 | }
386 | startPlay();
387 | }
388 |
389 | /**
390 | * 为了实现触摸时和过后一定时间内不滑动,这里拦截
391 | * @param ev
392 | * @return
393 | */
394 | @Override
395 | public boolean dispatchTouchEvent(MotionEvent ev) {
396 | mRecentTouchTime = System.currentTimeMillis();
397 | mGestureDetector.onTouchEvent(ev);
398 | return super.dispatchTouchEvent(ev);
399 | }
400 |
401 | @Override
402 | public void onPageScrollStateChanged(int arg0) {
403 | // TODO Auto-generated method stub
404 |
405 | }
406 |
407 | @Override
408 | public void onPageScrolled(int arg0, float arg1, int arg2) {
409 | // TODO Auto-generated method stub
410 |
411 | }
412 |
413 | @Override
414 | public void onPageSelected(int arg0) {
415 | mHintViewDelegate.setCurrentPosition(arg0, (HintView) mHintView);
416 | }
417 |
418 | }
419 |
--------------------------------------------------------------------------------
/rollviewpager/src/main/java/com/jude/rollviewpager/Util.java:
--------------------------------------------------------------------------------
1 | package com.jude.rollviewpager;
2 |
3 | import android.content.Context;
4 |
5 | public class Util {
6 | /**
7 | * dpתpx
8 | *
9 | */
10 | public static int dip2px(Context ctx,float dpValue) {
11 | final float scale = ctx.getResources().getDisplayMetrics().density;
12 | return (int) (dpValue * scale + 0.5f);
13 | }
14 |
15 |
16 | /**
17 | * pxתdp
18 | */
19 | public static int px2dip(Context ctx,float pxValue) {
20 | final float scale = ctx.getResources().getDisplayMetrics().density;
21 | return (int) (pxValue / scale + 0.5f);
22 | }
23 |
24 | }
25 |
--------------------------------------------------------------------------------
/rollviewpager/src/main/java/com/jude/rollviewpager/adapter/DynamicPagerAdapter.java:
--------------------------------------------------------------------------------
1 | package com.jude.rollviewpager.adapter;
2 |
3 | import android.support.v4.view.PagerAdapter;
4 | import android.view.View;
5 | import android.view.ViewGroup;
6 |
7 |
8 | /**
9 | * 动态管理的Adapter。概念参照{@link android.support.v4.app.FragmentPagerAdapter}
10 | * 每次都会创建新view,销毁旧View。节省内存消耗性能
11 | *
12 | * Subclasses only need to implement {@link #getView(ViewGroup,int)}
13 | * and {@link #getCount()} to have a working adapter.
14 | *
15 | */
16 | public abstract class DynamicPagerAdapter extends PagerAdapter {
17 |
18 | @Override
19 | public boolean isViewFromObject(View arg0, Object arg1) {
20 | return arg0==arg1;
21 | }
22 |
23 | @Override
24 | public void destroyItem(ViewGroup container, int position, Object object) {
25 | container.removeView((View) object);
26 | }
27 |
28 | @Override
29 | public int getItemPosition(Object object) {
30 | return super.getItemPosition(object);
31 | }
32 |
33 | @Override
34 | public Object instantiateItem(ViewGroup container, int position) {
35 | View itemView = getView(container,position);
36 | container.addView(itemView);
37 | return itemView;
38 | }
39 | public abstract View getView(ViewGroup container, int position);
40 |
41 | }
42 |
--------------------------------------------------------------------------------
/rollviewpager/src/main/java/com/jude/rollviewpager/adapter/LoopPagerAdapter.java:
--------------------------------------------------------------------------------
1 | package com.jude.rollviewpager.adapter;
2 |
3 | import android.database.DataSetObserver;
4 | import android.support.v4.view.PagerAdapter;
5 | import android.support.v4.view.ViewPager;
6 | import android.view.View;
7 | import android.view.ViewGroup;
8 |
9 | import com.jude.rollviewpager.HintView;
10 | import com.jude.rollviewpager.RollPagerView;
11 |
12 | import java.lang.reflect.Field;
13 | import java.util.ArrayList;
14 |
15 | /**
16 | * Created by Mr.Jude on 2016/1/9.
17 | */
18 | public abstract class LoopPagerAdapter extends PagerAdapter{
19 | private RollPagerView mViewPager;
20 |
21 | private ArrayList mViewList = new ArrayList<>();
22 |
23 | private class LoopHintViewDelegate implements RollPagerView.HintViewDelegate{
24 | @Override
25 | public void setCurrentPosition(int position, HintView hintView) {
26 | if (hintView!=null&&getRealCount()>0)
27 | hintView.setCurrent(position%getRealCount());
28 | }
29 |
30 | @Override
31 | public void initView(int length, int gravity, HintView hintView) {
32 | if (hintView!=null)
33 | hintView.initView(getRealCount(),gravity);
34 | }
35 | }
36 |
37 | @Override
38 | public void notifyDataSetChanged() {
39 | mViewList.clear();
40 | initPosition();
41 | super.notifyDataSetChanged();
42 | }
43 |
44 | @Override
45 | public int getItemPosition(Object object) {
46 | return POSITION_NONE;
47 | }
48 |
49 | @Override
50 | public void registerDataSetObserver(DataSetObserver observer) {
51 | super.registerDataSetObserver(observer);
52 | initPosition();
53 | }
54 |
55 | private void initPosition(){
56 | if (mViewPager.getViewPager().getCurrentItem() == 0&&getRealCount()>0){
57 | int half = Integer.MAX_VALUE/2;
58 | int start = half - half%getRealCount();
59 | setCurrent(start);
60 | }
61 | }
62 |
63 | private void setCurrent(int index){
64 | try {
65 | Field field = ViewPager.class.getDeclaredField("mCurItem");
66 | field.setAccessible(true);
67 | field.set(mViewPager.getViewPager(),index);
68 | } catch (NoSuchFieldException e) {
69 | e.printStackTrace();
70 | } catch (IllegalAccessException e) {
71 | e.printStackTrace();
72 | }
73 | }
74 |
75 | public LoopPagerAdapter(RollPagerView viewPager){
76 | this.mViewPager = viewPager;
77 | viewPager.setHintViewDelegate(new LoopHintViewDelegate());
78 | }
79 |
80 | @Override
81 | public boolean isViewFromObject(View arg0, Object arg1) {
82 | return arg0==arg1;
83 | }
84 |
85 | @Override
86 | public void destroyItem(ViewGroup container, int position, Object object) {
87 | container.removeView((View) object);
88 | }
89 |
90 | @Override
91 | public Object instantiateItem(ViewGroup container, int position) {
92 | int realPosition = position%getRealCount();
93 | View itemView = findViewByPosition(container,realPosition);
94 | container.addView(itemView);
95 | return itemView;
96 | }
97 |
98 |
99 | private View findViewByPosition(ViewGroup container,int position){
100 | for (View view : mViewList) {
101 | if (((int)view.getTag()) == position&&view.getParent()==null){
102 | return view;
103 | }
104 | }
105 | View view = getView(container,position);
106 | view.setTag(position);
107 | mViewList.add(view);
108 | return view;
109 | }
110 |
111 | public abstract View getView(ViewGroup container, int position);
112 |
113 | @Deprecated
114 | @Override
115 | public final int getCount() {
116 | return getRealCount()<=0?getRealCount():Integer.MAX_VALUE;
117 | }
118 |
119 | public abstract int getRealCount();
120 | }
121 |
--------------------------------------------------------------------------------
/rollviewpager/src/main/java/com/jude/rollviewpager/adapter/StaticPagerAdapter.java:
--------------------------------------------------------------------------------
1 | package com.jude.rollviewpager.adapter;
2 |
3 |
4 | import android.support.v4.view.PagerAdapter;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 |
8 | import java.util.ArrayList;
9 |
10 |
11 | /**
12 | * 静态存储的Adapter。概念参照{@link android.support.v4.app.FragmentStatePagerAdapter}
13 | * view添加进去就不管了,View长在,内存不再。
14 | * Subclasses only need to implement {@link #getView(ViewGroup,int)}
15 | * and {@link #getCount()} to have a working adapter.
16 | *
17 | */
18 | public abstract class StaticPagerAdapter extends PagerAdapter {
19 | private ArrayList mViewList = new ArrayList<>();
20 |
21 | @Override
22 | public boolean isViewFromObject(View arg0, Object arg1) {
23 | return arg0==arg1;
24 | }
25 |
26 | @Override
27 | public void destroyItem(ViewGroup container, int position, Object object) {
28 | container.removeView((View) object);
29 | }
30 |
31 | @Override
32 | public void notifyDataSetChanged() {
33 | mViewList.clear();
34 | super.notifyDataSetChanged();
35 | }
36 |
37 | @Override
38 | public int getItemPosition(Object object) {
39 | return POSITION_NONE;
40 | }
41 |
42 | @Override
43 | public Object instantiateItem(ViewGroup container, int position) {
44 | View itemView = findViewByPosition(container,position);
45 | container.addView(itemView);
46 | onBind(itemView,position);
47 | return itemView;
48 | }
49 |
50 | private View findViewByPosition(ViewGroup container,int position){
51 | for (View view : mViewList) {
52 | if (((int)view.getTag()) == position&&view.getParent()==null){
53 | return view;
54 | }
55 | }
56 | View view = getView(container,position);
57 | view.setTag(position);
58 | mViewList.add(view);
59 | return view;
60 | }
61 |
62 |
63 | public void onBind(View view,int position){
64 | }
65 |
66 | public abstract View getView(ViewGroup container, int position);
67 |
68 | }
69 |
--------------------------------------------------------------------------------
/rollviewpager/src/main/java/com/jude/rollviewpager/hintview/ColorPointHintView.java:
--------------------------------------------------------------------------------
1 | package com.jude.rollviewpager.hintview;
2 |
3 | import android.content.Context;
4 | import android.graphics.drawable.Drawable;
5 | import android.graphics.drawable.GradientDrawable;
6 |
7 | import com.jude.rollviewpager.Util;
8 |
9 | /**
10 | * Created by Mr.Jude on 2016/1/10.
11 | */
12 | public class ColorPointHintView extends ShapeHintView {
13 | private int focusColor;
14 | private int normalColor;
15 |
16 | public ColorPointHintView(Context context,int focusColor,int normalColor) {
17 | super(context);
18 | this.focusColor = focusColor;
19 | this.normalColor = normalColor;
20 | }
21 |
22 | @Override
23 | public Drawable makeFocusDrawable() {
24 | GradientDrawable dot_focus = new GradientDrawable();
25 | dot_focus.setColor(focusColor);
26 | dot_focus.setCornerRadius(Util.dip2px(getContext(), 4));
27 | dot_focus.setSize(Util.dip2px(getContext(), 8), Util.dip2px(getContext(), 8));
28 | return dot_focus;
29 | }
30 |
31 | @Override
32 | public Drawable makeNormalDrawable() {
33 | GradientDrawable dot_normal = new GradientDrawable();
34 | dot_normal.setColor(normalColor);
35 | dot_normal.setCornerRadius(Util.dip2px(getContext(), 4));
36 | dot_normal.setSize(Util.dip2px(getContext(), 8), Util.dip2px(getContext(), 8));
37 | return dot_normal;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/rollviewpager/src/main/java/com/jude/rollviewpager/hintview/IconHintView.java:
--------------------------------------------------------------------------------
1 | package com.jude.rollviewpager.hintview;
2 |
3 | import android.content.Context;
4 | import android.graphics.Bitmap;
5 | import android.graphics.Canvas;
6 | import android.graphics.Matrix;
7 | import android.graphics.PixelFormat;
8 | import android.graphics.drawable.BitmapDrawable;
9 | import android.graphics.drawable.Drawable;
10 | import android.support.annotation.DrawableRes;
11 |
12 | import com.jude.rollviewpager.Util;
13 |
14 | /**
15 | * Created by Mr.Jude on 2016/1/10.
16 | */
17 | public class IconHintView extends ShapeHintView {
18 | private int focusResId;
19 | private int normalResId;
20 | private int size;
21 |
22 |
23 | public IconHintView(Context context,@DrawableRes int focusResId,@DrawableRes int normalResId) {
24 | this(context, focusResId, normalResId, Util.dip2px(context,32));
25 | }
26 |
27 | public IconHintView(Context context,@DrawableRes int focusResId,@DrawableRes int normalResId,int size) {
28 | super(context);
29 | this.focusResId = focusResId;
30 | this.normalResId = normalResId;
31 | this.size = size;
32 | }
33 |
34 | @Override
35 | public Drawable makeFocusDrawable() {
36 | Drawable drawable = getContext().getResources().getDrawable(focusResId);
37 | if (size>0){
38 | drawable = zoomDrawable(drawable,size,size);
39 | }
40 | return drawable;
41 | }
42 |
43 | @Override
44 | public Drawable makeNormalDrawable() {
45 | Drawable drawable = getContext().getResources().getDrawable(normalResId);
46 | if (size>0){
47 | drawable = zoomDrawable(drawable,size,size);
48 | }
49 | return drawable;
50 | }
51 |
52 | private Drawable zoomDrawable(Drawable drawable, int w, int h) {
53 | int width = drawable.getIntrinsicWidth();
54 | int height = drawable.getIntrinsicHeight();
55 | Bitmap oldbmp = drawableToBitmap(drawable);
56 | Matrix matrix = new Matrix();
57 | float scaleWidth = ((float) w / width);
58 | float scaleHeight = ((float) h / height);
59 | matrix.postScale(scaleWidth, scaleHeight);
60 | Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height,
61 | matrix, true);
62 | return new BitmapDrawable(null, newbmp);
63 | }
64 |
65 | private Bitmap drawableToBitmap(Drawable drawable) {
66 | int width = drawable.getIntrinsicWidth();
67 | int height = drawable.getIntrinsicHeight();
68 | Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
69 | : Bitmap.Config.RGB_565;
70 | Bitmap bitmap = Bitmap.createBitmap(width, height, config);
71 | Canvas canvas = new Canvas(bitmap);
72 | drawable.setBounds(0, 0, width, height);
73 | drawable.draw(canvas);
74 | return bitmap;
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/rollviewpager/src/main/java/com/jude/rollviewpager/hintview/ShapeHintView.java:
--------------------------------------------------------------------------------
1 | package com.jude.rollviewpager.hintview;
2 |
3 | import android.content.Context;
4 | import android.graphics.drawable.Drawable;
5 | import android.util.AttributeSet;
6 | import android.view.Gravity;
7 | import android.widget.ImageView;
8 | import android.widget.LinearLayout;
9 |
10 | import com.jude.rollviewpager.HintView;
11 |
12 | public abstract class ShapeHintView extends LinearLayout implements HintView {
13 | private ImageView[] mDots;
14 | private int length = 0;
15 | private int lastPosition = 0;
16 |
17 | private Drawable dot_normal;
18 | private Drawable dot_focus;
19 |
20 | public ShapeHintView(Context context){
21 | super(context);
22 | }
23 |
24 | public ShapeHintView(Context context, AttributeSet attrs) {
25 | super(context, attrs);
26 | }
27 |
28 |
29 | public abstract Drawable makeFocusDrawable();
30 |
31 | public abstract Drawable makeNormalDrawable();
32 |
33 | @Override
34 | public void initView(int length, int gravity) {
35 | removeAllViews();
36 | lastPosition = 0;
37 | setOrientation(HORIZONTAL);
38 | switch (gravity) {
39 | case 0:
40 | setGravity(Gravity.LEFT| Gravity.CENTER_VERTICAL);
41 | break;
42 | case 1:
43 | setGravity(Gravity.CENTER);
44 | break;
45 | case 2:
46 | setGravity(Gravity.RIGHT| Gravity.CENTER_VERTICAL);
47 | break;
48 | }
49 |
50 | this.length = length;
51 | mDots = new ImageView[length];
52 |
53 | dot_focus = makeFocusDrawable();
54 | dot_normal = makeNormalDrawable();
55 |
56 | for (int i = 0; i < length; i++) {
57 | mDots[i]=new ImageView(getContext());
58 | LayoutParams dotlp = new LayoutParams(
59 | LayoutParams.WRAP_CONTENT,
60 | LayoutParams.WRAP_CONTENT);
61 | dotlp.setMargins(10, 0, 10, 0);
62 | mDots[i].setLayoutParams(dotlp);
63 | mDots[i].setBackgroundDrawable(dot_normal);
64 | addView(mDots[i]);
65 | }
66 |
67 | setCurrent(0);
68 | }
69 |
70 | @Override
71 | public void setCurrent(int current) {
72 | if (current < 0 || current > length - 1) {
73 | return;
74 | }
75 | mDots[lastPosition].setBackgroundDrawable(dot_normal);
76 | mDots[current].setBackgroundDrawable(dot_focus);
77 | lastPosition = current;
78 | }
79 | }
80 |
--------------------------------------------------------------------------------
/rollviewpager/src/main/java/com/jude/rollviewpager/hintview/TextHintView.java:
--------------------------------------------------------------------------------
1 | package com.jude.rollviewpager.hintview;
2 |
3 | import android.content.Context;
4 | import android.graphics.Color;
5 | import android.util.AttributeSet;
6 | import android.view.Gravity;
7 | import android.widget.TextView;
8 |
9 | import com.jude.rollviewpager.HintView;
10 |
11 | public class TextHintView extends TextView implements HintView {
12 | private int length;
13 |
14 | public TextHintView(Context context){
15 | super(context);
16 | }
17 |
18 | public TextHintView(Context context, AttributeSet attrs) {
19 | super(context, attrs);
20 | }
21 |
22 | @Override
23 | public void initView(int length, int gravity) {
24 | this.length = length;
25 | setTextColor(Color.WHITE);
26 | switch (gravity) {
27 | case 0:
28 | setGravity(Gravity.LEFT| Gravity.CENTER_VERTICAL);
29 | break;
30 | case 1:
31 | setGravity(Gravity.CENTER);
32 | break;
33 | case 2:
34 | setGravity(Gravity.RIGHT| Gravity.CENTER_VERTICAL);
35 | break;
36 | }
37 |
38 | setCurrent(0);
39 | }
40 |
41 | @Override
42 | public void setCurrent(int current) {
43 | setText(current+1+"/"+ length);
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/rollviewpager/src/main/res/values/attrs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/rollviewpager/src/main/res/values/ids.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/rollviewpager/upload_jcenter.gradle:
--------------------------------------------------------------------------------
1 |
2 | def siteUrl = 'https://github.com/Jude95/RollViewPager' // 项目的主页
3 | def gitUrl = 'https://github.com/Jude95/RollViewPager' // Git仓库的url
4 |
5 | group = "com.jude"
6 |
7 | install {
8 | repositories.mavenInstaller {
9 | // This generates POM.xml with proper parameters
10 | pom.project {
11 | artifactId = "rollviewpager" // 项目名称
12 | packaging 'aar'
13 | // Add your description here
14 | name 'rollviewpager' //项目描述
15 | url siteUrl
16 | // Set your license
17 | licenses {
18 | license {
19 | name 'The Apache Software License, Version 2.0'
20 | url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
21 | }
22 | }
23 | developers {
24 | developer {
25 | id 'jude95' //填写的一些基本信息
26 | name 'jude95'
27 | email '973829691@qq.com'
28 | }
29 | }
30 | scm {
31 | connection gitUrl
32 | developerConnection gitUrl
33 | url siteUrl
34 | }
35 | }
36 | }
37 | }
38 |
39 | task sourcesJar(type: Jar) {
40 | from android.sourceSets.main.java.srcDirs
41 | classifier = 'sources'
42 | }
43 |
44 | artifacts {
45 | archives sourcesJar
46 | }
47 |
48 | android.libraryVariants.all { variant ->
49 | println variant.javaCompile.classpath.files
50 | if(variant.name == 'release') { //我们只需 release 的 javadoc
51 | task("generate${variant.name.capitalize()}Javadoc", type: Javadoc) {
52 | // title = ''
53 | // description = ''
54 | source = variant.javaCompile.source
55 | classpath = files(variant.javaCompile.classpath.files, project.android.getBootClasspath())
56 | options {
57 | encoding "utf-8"
58 | links "http://docs.oracle.com/javase/7/docs/api/"
59 | linksOffline "http://d.android.com/reference", "${android.sdkDirectory}/docs/reference"
60 | }
61 | exclude '**/BuildConfig.java'
62 | exclude '**/R.java'
63 | }
64 | task("javadoc${variant.name.capitalize()}Jar", type: Jar, dependsOn: "generate${variant.name.capitalize()}Javadoc") {
65 | classifier = 'javadoc'
66 | from tasks.getByName("generate${variant.name.capitalize()}Javadoc").destinationDir
67 | }
68 | artifacts {
69 | archives tasks.getByName("javadoc${variant.name.capitalize()}Jar")
70 | }
71 | }
72 | }
73 |
74 | Properties properties = new Properties()
75 | properties.load(project.rootProject.file('local.properties').newDataInputStream())
76 | bintray {
77 | user = properties.getProperty("bintray.user")
78 | key = properties.getProperty("bintray.apikey")
79 | configurations = ['archives']
80 | pkg {
81 | repo = "maven"
82 | name = "rollviewpager" //发布到JCenter上的项目名字
83 | desc = "a viewpager can auto roll"
84 | websiteUrl = siteUrl
85 | vcsUrl = gitUrl
86 | licenses = ["Apache-2.0"]
87 | publish = true
88 | }
89 | }
--------------------------------------------------------------------------------
/rollviewpagerdome/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/rollviewpagerdome/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 24
5 | buildToolsVersion "24.0.1"
6 |
7 | defaultConfig {
8 | applicationId "com.jude.rollviewpagerdome"
9 | minSdkVersion 14
10 | targetSdkVersion 24
11 | versionCode 1
12 | versionName "1.0"
13 | }
14 | buildTypes {
15 | release {
16 | minifyEnabled false
17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
18 | }
19 | }
20 | }
21 |
22 | dependencies {
23 | compile fileTree(include: ['*.jar'], dir: 'libs')
24 | compile 'com.android.support:appcompat-v7:24.2.0'
25 | compile 'com.github.bumptech.glide:glide:3.7.0'
26 | compile 'com.squareup.okhttp3:okhttp:3.5.0'
27 | compile project(':rollviewpager')
28 | }
29 |
--------------------------------------------------------------------------------
/rollviewpagerdome/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Users/zhuchenxi/Library/Android/sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/rollviewpagerdome/src/androidTest/java/com/jude/rollviewpagerdome/ApplicationTest.java:
--------------------------------------------------------------------------------
1 | package com.jude.rollviewpagerdome;
2 |
3 | import android.app.Application;
4 | import android.test.ApplicationTestCase;
5 |
6 | /**
7 | * Testing Fundamentals
8 | */
9 | public class ApplicationTest extends ApplicationTestCase {
10 | public ApplicationTest() {
11 | super(Application.class);
12 | }
13 | }
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
12 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
22 |
24 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/java/com/jude/rollviewpagerdome/LoopActivity.java:
--------------------------------------------------------------------------------
1 | package com.jude.rollviewpagerdome;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 | import android.support.v7.app.AppCompatActivity;
6 | import android.view.View;
7 | import android.view.ViewGroup;
8 | import android.widget.ImageView;
9 |
10 | import com.jude.rollviewpager.RollPagerView;
11 | import com.jude.rollviewpager.adapter.LoopPagerAdapter;
12 |
13 | /**
14 | * Created by zhuchenxi on 2016/12/13.
15 | */
16 |
17 | public class LoopActivity extends AppCompatActivity {
18 | private RollPagerView mViewPager;
19 |
20 | @Override
21 | protected void onCreate(@Nullable Bundle savedInstanceState) {
22 | super.onCreate(savedInstanceState);
23 | setContentView(R.layout.activity_simple);
24 | mViewPager = (RollPagerView) findViewById(R.id.view_pager);
25 | mViewPager.setAdapter(new ImageLoopAdapter(mViewPager));
26 | }
27 |
28 | private class ImageLoopAdapter extends LoopPagerAdapter {
29 | int[] imgs = new int[]{
30 | R.drawable.img1,
31 | R.drawable.img2,
32 | R.drawable.img3,
33 | R.drawable.img4,
34 | R.drawable.img5,
35 | };
36 |
37 | public ImageLoopAdapter(RollPagerView viewPager) {
38 | super(viewPager);
39 | }
40 |
41 | @Override
42 | public View getView(ViewGroup container, int position) {
43 | ImageView view = new ImageView(container.getContext());
44 | view.setScaleType(ImageView.ScaleType.CENTER_CROP);
45 | view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
46 | view.setImageResource(imgs[position]);
47 | return view;
48 | }
49 |
50 | @Override
51 | public int getRealCount() {
52 | return imgs.length;
53 | }
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/java/com/jude/rollviewpagerdome/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.jude.rollviewpagerdome;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 | import android.support.annotation.Nullable;
6 | import android.support.v7.app.AppCompatActivity;
7 | import android.view.View;
8 |
9 | import com.jude.rollviewpager.RollPagerView;
10 |
11 | /**
12 | * Created by zhuchenxi on 2016/12/13.
13 | */
14 |
15 | public class MainActivity extends AppCompatActivity {
16 |
17 | @Override
18 | protected void onCreate(@Nullable Bundle savedInstanceState) {
19 | super.onCreate(savedInstanceState);
20 | setContentView(R.layout.activity_main);
21 |
22 | }
23 |
24 | public void simple(View view){
25 | Intent i = new Intent(this,SimpleActivity.class);
26 | startActivity(i);
27 | }
28 |
29 | public void loop(View view){
30 | Intent i = new Intent(this,LoopActivity.class);
31 | startActivity(i);
32 | }
33 |
34 | public void netImage(View view){
35 | Intent i = new Intent(this,NetImageActivity.class);
36 | startActivity(i);
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/java/com/jude/rollviewpagerdome/NetImageActivity.java:
--------------------------------------------------------------------------------
1 | package com.jude.rollviewpagerdome;
2 |
3 | import android.graphics.Color;
4 | import android.os.Bundle;
5 | import android.os.Handler;
6 | import android.support.v7.app.AppCompatActivity;
7 | import android.text.TextUtils;
8 | import android.util.Log;
9 | import android.view.View;
10 | import android.view.ViewGroup;
11 | import android.widget.Button;
12 | import android.widget.ImageView;
13 | import android.widget.Toast;
14 |
15 | import com.bumptech.glide.Glide;
16 | import com.jude.rollviewpager.OnItemClickListener;
17 | import com.jude.rollviewpager.RollPagerView;
18 | import com.jude.rollviewpager.adapter.LoopPagerAdapter;
19 | import com.jude.rollviewpager.adapter.StaticPagerAdapter;
20 | import com.jude.rollviewpager.hintview.ColorPointHintView;
21 | import com.jude.rollviewpager.hintview.IconHintView;
22 |
23 | import org.json.JSONArray;
24 | import org.json.JSONException;
25 | import org.json.JSONObject;
26 |
27 | import java.io.IOException;
28 | import java.util.Random;
29 |
30 | import okhttp3.Call;
31 | import okhttp3.Callback;
32 | import okhttp3.OkHttpClient;
33 | import okhttp3.Request;
34 | import okhttp3.Response;
35 |
36 | public class NetImageActivity extends AppCompatActivity {
37 | private RollPagerView mLoopViewPager;
38 | private Button mBtnPre,mBtnAfter;
39 | private TestLoopAdapter mLoopAdapter;
40 | OkHttpClient client = new OkHttpClient();
41 |
42 | int mPage = 1;
43 |
44 | @Override
45 | protected void onCreate(Bundle savedInstanceState) {
46 | super.onCreate(savedInstanceState);
47 | setContentView(R.layout.activity_net_image);
48 | mLoopViewPager= (RollPagerView) findViewById(R.id.loop_view_pager);
49 | mLoopViewPager.setPlayDelay(1000);
50 | mLoopViewPager.setAdapter(mLoopAdapter = new TestLoopAdapter(mLoopViewPager));
51 | mLoopViewPager.setHintView(new IconHintView(this,R.drawable.point_focus,R.drawable.point_normal));
52 | mLoopViewPager.setOnItemClickListener(new OnItemClickListener() {
53 | @Override
54 | public void onItemClick(int position) {
55 | Toast.makeText(NetImageActivity.this,"Item "+position+" clicked",Toast.LENGTH_SHORT).show();
56 | }
57 | });
58 |
59 | mBtnPre = (Button) findViewById(R.id.pre);
60 | mBtnAfter = (Button) findViewById(R.id.after);
61 |
62 | mBtnPre.setOnClickListener(new View.OnClickListener() {
63 | @Override
64 | public void onClick(View v) {
65 | if (mPage>1)
66 | getData(--mPage);
67 | }
68 | });
69 | mBtnAfter.setOnClickListener(new View.OnClickListener() {
70 | @Override
71 | public void onClick(View v) {
72 | getData(++mPage);
73 | }
74 | });
75 | getData(mPage);
76 | }
77 |
78 |
79 | public void getData(final int page){
80 | Request request = new Request.Builder()
81 | .url("http://gank.io/api/data/%E7%A6%8F%E5%88%A9/"+5+"/"+page)
82 | .get()
83 | .build();
84 | Call call = client.newCall(request);
85 | call.enqueue(new Callback() {
86 | @Override
87 | public void onFailure(Call call, final IOException e) {
88 | Log.i("NetImageActivity","error:"+e.getMessage());
89 | runOnUiThread(new Runnable() {
90 | @Override
91 | public void run() {
92 | Toast.makeText(NetImageActivity.this,"网络请求失败,error:"+e.getMessage(),Toast.LENGTH_SHORT).show();
93 | }
94 | });
95 | }
96 |
97 | @Override
98 | public void onResponse(Call call, Response response) throws IOException {
99 | try {
100 | String content = response.body().string();
101 | Log.i("NetImageActivity","raw data:"+content);
102 |
103 | JSONObject jsonObject = new JSONObject(content);
104 | JSONArray strArr = jsonObject.getJSONArray("results");
105 | final String[] imgs = new String[strArr.length()];
106 | for (int i = 0; i < strArr.length(); i++) {
107 | JSONObject obj = strArr.getJSONObject(i);
108 | imgs[i] = obj.getString("url");
109 | }
110 | runOnUiThread(new Runnable() {
111 | @Override
112 | public void run() {
113 | mLoopAdapter.setImgs(imgs);
114 | }
115 | });
116 | } catch (JSONException e) {
117 | e.printStackTrace();
118 | }
119 | }
120 | });
121 | }
122 |
123 |
124 | private class TestLoopAdapter extends LoopPagerAdapter{
125 | String[] imgs = new String[0];
126 |
127 | public void setImgs(String[] imgs){
128 | this.imgs = imgs;
129 | notifyDataSetChanged();
130 | }
131 |
132 |
133 | public TestLoopAdapter(RollPagerView viewPager) {
134 | super(viewPager);
135 | }
136 |
137 | @Override
138 | public View getView(ViewGroup container, int position) {
139 | Log.i("RollViewPager","getView:"+imgs[position]);
140 |
141 | ImageView view = new ImageView(container.getContext());
142 | view.setOnClickListener(new View.OnClickListener() {
143 | @Override
144 | public void onClick(View v) {
145 | Log.i("RollViewPager","onClick");
146 | }
147 | });
148 | view.setScaleType(ImageView.ScaleType.CENTER_CROP);
149 | view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
150 | Glide.with(NetImageActivity.this)
151 | .load(imgs[position])
152 | .placeholder(R.drawable.loading)
153 | .into(view);
154 | return view;
155 | }
156 |
157 | @Override
158 | public int getRealCount() {
159 | return imgs.length;
160 | }
161 |
162 | }
163 | }
164 |
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/java/com/jude/rollviewpagerdome/SimpleActivity.java:
--------------------------------------------------------------------------------
1 | package com.jude.rollviewpagerdome;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 | import android.support.v7.app.AppCompatActivity;
6 | import android.view.View;
7 | import android.view.ViewGroup;
8 | import android.widget.ImageView;
9 |
10 | import com.jude.rollviewpager.RollPagerView;
11 | import com.jude.rollviewpager.adapter.StaticPagerAdapter;
12 |
13 | /**
14 | * Created by zhuchenxi on 2016/12/13.
15 | */
16 |
17 | public class SimpleActivity extends AppCompatActivity {
18 | private RollPagerView mViewPager;
19 |
20 | @Override
21 | protected void onCreate(@Nullable Bundle savedInstanceState) {
22 | super.onCreate(savedInstanceState);
23 | setContentView(R.layout.activity_simple);
24 | mViewPager = (RollPagerView) findViewById(R.id.view_pager);
25 | mViewPager.setAdapter(new ImageNormalAdapter());
26 | }
27 |
28 | private class ImageNormalAdapter extends StaticPagerAdapter {
29 | int[] imgs = new int[]{
30 | R.drawable.img1,
31 | R.drawable.img2,
32 | R.drawable.img3,
33 | R.drawable.img4,
34 | R.drawable.img5,
35 | };
36 |
37 | @Override
38 | public View getView(ViewGroup container, int position) {
39 | ImageView view = new ImageView(container.getContext());
40 | view.setScaleType(ImageView.ScaleType.CENTER_CROP);
41 | view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
42 | view.setImageResource(imgs[position]);
43 | return view;
44 | }
45 |
46 |
47 | @Override
48 | public int getCount() {
49 | return imgs.length;
50 | }
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/res/drawable/img1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jude95/RollViewPager/e8510c3556e51149361f0c0318380224d1d5a3d2/rollviewpagerdome/src/main/res/drawable/img1.jpg
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/res/drawable/img2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jude95/RollViewPager/e8510c3556e51149361f0c0318380224d1d5a3d2/rollviewpagerdome/src/main/res/drawable/img2.jpg
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/res/drawable/img3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jude95/RollViewPager/e8510c3556e51149361f0c0318380224d1d5a3d2/rollviewpagerdome/src/main/res/drawable/img3.jpg
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/res/drawable/img4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jude95/RollViewPager/e8510c3556e51149361f0c0318380224d1d5a3d2/rollviewpagerdome/src/main/res/drawable/img4.jpg
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/res/drawable/img5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jude95/RollViewPager/e8510c3556e51149361f0c0318380224d1d5a3d2/rollviewpagerdome/src/main/res/drawable/img5.jpg
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/res/drawable/loading.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jude95/RollViewPager/e8510c3556e51149361f0c0318380224d1d5a3d2/rollviewpagerdome/src/main/res/drawable/loading.png
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/res/drawable/point_focus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jude95/RollViewPager/e8510c3556e51149361f0c0318380224d1d5a3d2/rollviewpagerdome/src/main/res/drawable/point_focus.png
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/res/drawable/point_normal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jude95/RollViewPager/e8510c3556e51149361f0c0318380224d1d5a3d2/rollviewpagerdome/src/main/res/drawable/point_normal.png
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
13 |
19 |
25 |
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/res/layout/activity_net_image.xml:
--------------------------------------------------------------------------------
1 |
8 |
9 |
14 |
15 |
19 |
26 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/res/layout/activity_simple.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
12 |
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/res/menu/menu_main.xml:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jude95/RollViewPager/e8510c3556e51149361f0c0318380224d1d5a3d2/rollviewpagerdome/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jude95/RollViewPager/e8510c3556e51149361f0c0318380224d1d5a3d2/rollviewpagerdome/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jude95/RollViewPager/e8510c3556e51149361f0c0318380224d1d5a3d2/rollviewpagerdome/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jude95/RollViewPager/e8510c3556e51149361f0c0318380224d1d5a3d2/rollviewpagerdome/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 |
6 |
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | RollViewPagerDome
3 |
4 | Hello world!
5 | Settings
6 |
7 |
--------------------------------------------------------------------------------
/rollviewpagerdome/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':rollviewpager', ':rollviewpagerdome'
2 |
--------------------------------------------------------------------------------