1. 程式人生 > >(自定義View)自動翻頁ViewPager

(自定義View)自動翻頁ViewPager

/**
 * 描述:自動翻頁ViewPager
 * 作者:FrankChoo
 */
public class AutoSlideViewPager extends FrameLayout {
    private ViewPager mViewPager;
    private AutoSlideViewPagerAdapter mAdapter;
    private List<ImageView> mImageViewList = new ArrayList<>();//放圖片的list
    private List<ImageView> mDotViewList = new
ArrayList<>();//放圓點的View的list private boolean mIsAutoPlay = true;//是否開啟自動輪播 private int mAutoSlideTime = 5000;//自動翻頁時間(單位mm) private int mDotSize = 50;//小圓點的大小, 預設是50 private int mImageCount = 0;//圖片的數量 private int mCurrentItem = 0;//ViewPager的當前頁 private Context mContext; private Timer mTiemr = new
Timer();//定時任務 private TimerTask mTimerTask = new TimerTask() { @Override public void run() { post(new Runnable() {//post到主執行緒處理頁面切換 @Override public void run() { if (mIsAutoPlay) {//判斷當前狀態是否允許自動滑動 mCurrentItem = (mCurrentItem + 1
) % mImageCount; mViewPager.setCurrentItem(mCurrentItem); } } }); } }; private OnImageClickListener mListener;//圖片點選監聽器介面 public AutoSlideViewPager(Context context) { this(context, null); mContext = context; } public AutoSlideViewPager(Context context, AttributeSet attrs) { this(context, attrs, 0); mContext = context; } public AutoSlideViewPager(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; } /** * 設定小圓點的大小 */ public void setDotSize(int size) { mDotSize = size; } /** * 設定自動滑動時間間隔 */ public void setAutoSlideTime(int time) { mAutoSlideTime = time; } /** * 新增要迴圈的圖片 */ public void setImageUriList(List<?> imageUriList){ mImageCount = imageUriList.size(); for ( int i = 0; i < mImageCount ; i++) { addImageToList(i, imageUriList.get(i)); } } /** * 設定圖片點選監聽器 */ public void setOnImageClickListener(OnImageClickListener listener) { mListener = listener; } public interface OnImageClickListener { void onClick(int position);//介面的抽象方法根據需要自行修改 } @Override protected void onAttachedToWindow() { refreshUI(); super.onAttachedToWindow(); } /**重新整理當前自定義View*/ private void refreshUI() { removeAllViews(); //新增ViewPager到該ViewGroup mViewPager = new ViewPager(mContext); mViewPager.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); mViewPager.setFocusable(true); mAdapter = new AutoSlideViewPagerAdapter(mImageViewList); mViewPager.setAdapter(mAdapter); mViewPager.addOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { mCurrentItem = position; for(int i = 0; i < mImageCount; i++){ if(i == position){ mDotViewList.get(i).setImageResource(R.drawable.ic_dot_selected); }else { mDotViewList.get(i).setImageResource(R.drawable.ic_dot_unselected); } } } @Override public void onPageScrollStateChanged(int state) { Log.e("AutoSlideViewPager", "正在滑動"); switch (state) { //手指拖拽ViewPager時的狀態 case 1: { mIsAutoPlay = false;//當手指拖拽ViewPager時進位制自動翻頁 break; } //介面切換中 case 2: { mIsAutoPlay = true; break; } //滑動結束 case 0: { mIsAutoPlay = true; break; } } } }); addView(mViewPager); //新增小圓點到該ViewGroup for ( int i =0; i < mImageCount ; i++) { addView(mDotViewList.get(i)); } //開啟定時任務 mTiemr.schedule(mTimerTask, mAutoSlideTime, mAutoSlideTime); } /**新增ImageView到該ViewGroup*/ private void addImageToList(final int position, Object uri) { //將ImageView新增到List ImageView imageView = new ImageView(mContext); imageView.setScaleType(ScaleType.FIT_XY); imageView.setImageResource(R.mipmap.image_default);//圖片佔位符 Glide.with(mContext).load(uri).into(imageView); imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { mListener.onClick(position); } }); mImageViewList.add(imageView); //將小圓點新增進List ImageView dotView = new ImageView(mContext); dotView.setLayoutParams(new ViewGroup.LayoutParams(mDotSize, mDotSize)); dotView.setImageResource( position == 0 ? (R.drawable.ic_dot_selected) : (R.drawable.ic_dot_unselected)); mDotViewList.add(dotView); } /** * ViewPager介面卡 * 非靜態內部類會持有對外部類的引用, 可能會造成記憶體洩漏, 所以最好加上static */ private static class AutoSlideViewPagerAdapter extends PagerAdapter { private List<ImageView> children = new ArrayList<>(); AutoSlideViewPagerAdapter(List<ImageView> children) { this.children = children; } /**獲取子級佈局的數量*/ @Override public int getCount() { return children.size(); } /**判斷某個View物件是否為當前被新增到ViewPager容器中的物件*/ @Override public boolean isViewFromObject(View view, Object object) { return view == object; } /**例項化ViewPager容器中指定的position位置需要顯示的View物件*/ @Override public Object instantiateItem(ViewGroup container, int position) { View view = children.get(position); container.addView(view); return view; } /**在ViewPager中移除指定的positon位置的view物件*/ @Override public void destroyItem(ViewGroup container, int position, Object object) { View view = children.get(position); container.removeView(view); } } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { Log.e("AutoSlideViewPager", "onLayout"); super.onLayout(changed, left, top, right, bottom); int childCount = getChildCount(); if (childCount != 0) { for (int i = 0; i < getChildCount(); i++) { View childView = getChildAt(i); if (childView instanceof ImageView) { int spacing = mDotSize; int width = mDotSize; int start; if (mImageCount % 2 == 1) {//小白點的數量為奇數時的起點 start = (right - left) / 2 - width/2 - (mImageCount/2) * 2 * spacing; } else {//小白點的數量為偶數時的起點 start = (right - left)/2 - width/2 - (mImageCount -1) * spacing; } int mLeft = start + (i-1) * (2*spacing); int mTop = bottom - (bottom - top)/10; int mRight = mLeft + mDotSize; int mBottom = mTop + mDotSize; childView.layout(mLeft, mTop, mRight, mBottom); } else { childView.layout(0, 0, right, bottom); } } } } /**終止mTiemr定時任務, 防止記憶體洩漏*/ @Override protected void onDetachedFromWindow() { mTimerTask.cancel(); mTiemr.cancel(); mTiemr = null; mTimerTask = null; super.onDetachedFromWindow(); } }