|
@@ -0,0 +1,227 @@
|
|
|
+package com.example.zhpan.circleviewpager;
|
|
|
+
|
|
|
+import android.content.Context;
|
|
|
+import android.content.res.TypedArray;
|
|
|
+import android.os.Handler;
|
|
|
+import android.os.Message;
|
|
|
+import android.os.SystemClock;
|
|
|
+import android.support.v4.view.ViewPager;
|
|
|
+import android.util.AttributeSet;
|
|
|
+import android.view.LayoutInflater;
|
|
|
+import android.view.View;
|
|
|
+import android.widget.FrameLayout;
|
|
|
+import android.widget.ImageView;
|
|
|
+import android.widget.LinearLayout;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+
|
|
|
+ * Created by edianzu on 2017/3/28.
|
|
|
+ */
|
|
|
+
|
|
|
+public class CircleViewPager extends FrameLayout {
|
|
|
+ private View mView;
|
|
|
+ private ViewPager mViewPager;
|
|
|
+ private List<ImageView> mImageViewList;
|
|
|
+ private List<ImageView> mImageViewDotList;
|
|
|
+ private int[] images;
|
|
|
+ private LinearLayout mLinearLayoutDot;
|
|
|
+ private int dotPosition = 0;
|
|
|
+ private int prePosition = 0;
|
|
|
+ private int currentPosition = 1;
|
|
|
+ private CirclePagerAdapter adapter;
|
|
|
+
|
|
|
+ private int mLightDotRes;
|
|
|
+ private int mDarkDotRes;
|
|
|
+ private float mDotWidth;
|
|
|
+ private int interval;
|
|
|
+
|
|
|
+ Handler handler = new Handler() {
|
|
|
+ @Override
|
|
|
+ public void handleMessage(Message msg) {
|
|
|
+ super.handleMessage(msg);
|
|
|
+ if (msg.what == 1) {
|
|
|
+ mViewPager.setCurrentItem(currentPosition, false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ public CircleViewPager(Context context) {
|
|
|
+ super(context);
|
|
|
+ initView(null);
|
|
|
+ }
|
|
|
+
|
|
|
+ public CircleViewPager(Context context, AttributeSet attrs) {
|
|
|
+ this(context, attrs, 0);
|
|
|
+ initView(attrs);
|
|
|
+ }
|
|
|
+
|
|
|
+ public CircleViewPager(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
|
+ super(context, attrs, defStyleAttr);
|
|
|
+ initView(attrs);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
|
|
+ super.onLayout(changed, left, top, right, bottom);
|
|
|
+ if (changed) {
|
|
|
+ initData();
|
|
|
+ setDot();
|
|
|
+ setViewPager();
|
|
|
+ autoPlay();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void initView(AttributeSet attrs) {
|
|
|
+ if (attrs != null) {
|
|
|
+ TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.MyViewPager);
|
|
|
+ mLightDotRes = typedArray.getResourceId(R.styleable.MyViewPager_lightDotRes, R.drawable.red_dot);
|
|
|
+ mDarkDotRes = typedArray.getResourceId(R.styleable.MyViewPager_darkDotRes, R.drawable.red_dot_night);
|
|
|
+ mDotWidth = typedArray.getDimension(R.styleable.MyViewPager_dotWidth, 20);
|
|
|
+ interval=typedArray.getInteger(R.styleable.MyViewPager_interval,3000);
|
|
|
+ }
|
|
|
+ mView = LayoutInflater.from(getContext()).inflate(R.layout.view_pager_layout, this);
|
|
|
+ mLinearLayoutDot = (LinearLayout) mView.findViewById(R.id.ll_main_dot);
|
|
|
+ mViewPager = (ViewPager) mView.findViewById(R.id.vp_main);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private void initData() {
|
|
|
+ mImageViewList = new ArrayList<>();
|
|
|
+ mImageViewDotList = new ArrayList<>();
|
|
|
+ ImageView imageView;
|
|
|
+ if (images.length > 0) {
|
|
|
+ for (int i = 0; i < images.length + 2; i++) {
|
|
|
+ if (i == 0) {
|
|
|
+ imageView = new ImageView(getContext());
|
|
|
+ imageView.setBackgroundResource(images[images.length - 1]);
|
|
|
+ mImageViewList.add(imageView);
|
|
|
+ } else if (i == images.length + 1) {
|
|
|
+ imageView = new ImageView(getContext());
|
|
|
+ imageView.setBackgroundResource(images[0]);
|
|
|
+ mImageViewList.add(imageView);
|
|
|
+ } else {
|
|
|
+ imageView = new ImageView(getContext());
|
|
|
+ imageView.setBackgroundResource(images[i - 1]);
|
|
|
+ mImageViewList.add(imageView);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private void setDot() {
|
|
|
+
|
|
|
+ LinearLayout.LayoutParams params = new LinearLayout.LayoutParams((int) mDotWidth, (int) mDotWidth);
|
|
|
+ params.rightMargin = (int) (mDotWidth / 1.5);
|
|
|
+
|
|
|
+ for (int i = 0; i < images.length; i++) {
|
|
|
+ ImageView imageViewDot = new ImageView(getContext());
|
|
|
+ imageViewDot.setLayoutParams(params);
|
|
|
+
|
|
|
+ imageViewDot.setBackgroundResource(mDarkDotRes);
|
|
|
+ mLinearLayoutDot.addView(imageViewDot);
|
|
|
+ mImageViewDotList.add(imageViewDot);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (images.length > 0){
|
|
|
+ mImageViewDotList.get(dotPosition).setBackgroundResource(mLightDotRes);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private void setViewPager() {
|
|
|
+ adapter = new CirclePagerAdapter(mImageViewList);
|
|
|
+
|
|
|
+ mViewPager.setAdapter(adapter);
|
|
|
+
|
|
|
+ mViewPager.setCurrentItem(currentPosition);
|
|
|
+
|
|
|
+ mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
|
|
|
+ @Override
|
|
|
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
|
|
|
+
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public void onPageSelected(int position) {
|
|
|
+ if (position == 0) {
|
|
|
+ currentPosition = images.length;
|
|
|
+ dotPosition = images.length - 1;
|
|
|
+ } else if (position == images.length + 1) {
|
|
|
+ currentPosition = 1;
|
|
|
+ dotPosition = 0;
|
|
|
+ } else {
|
|
|
+ currentPosition = position;
|
|
|
+ dotPosition = position - 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ mImageViewDotList.get(prePosition).setBackgroundResource(mDarkDotRes);
|
|
|
+ mImageViewDotList.get(dotPosition).setBackgroundResource(mLightDotRes);
|
|
|
+ prePosition = dotPosition;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onPageScrollStateChanged(int state) {
|
|
|
+
|
|
|
+ if (state == ViewPager.SCROLL_STATE_IDLE) {
|
|
|
+ mViewPager.setCurrentItem(currentPosition, false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private void autoPlay() {
|
|
|
+ new Thread() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ super.run();
|
|
|
+ while (true) {
|
|
|
+ SystemClock.sleep(interval);
|
|
|
+ currentPosition++;
|
|
|
+ handler.sendEmptyMessage(1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }.start();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public float getDotWidth() {
|
|
|
+ return mDotWidth;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setDotWidth(float dotWidth) {
|
|
|
+ mDotWidth = ScreenUtils.dp2px(getContext(), dotWidth);
|
|
|
+ }
|
|
|
+
|
|
|
+ public int getLightDotRes() {
|
|
|
+ return mLightDotRes;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setLightDotRes(int lightDotRes) {
|
|
|
+ mLightDotRes = lightDotRes;
|
|
|
+ }
|
|
|
+
|
|
|
+ public int getDarkDotRes() {
|
|
|
+ return mDarkDotRes;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setDarkDotRes(int darkDotRes) {
|
|
|
+ mDarkDotRes = darkDotRes;
|
|
|
+ }
|
|
|
+
|
|
|
+ public int[] getImages() {
|
|
|
+ return images;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setImages(int[] images) {
|
|
|
+ this.images = images;
|
|
|
+ invalidate();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setInterval(int interval) {
|
|
|
+ this.interval = interval;
|
|
|
+ }
|
|
|
+}
|