(自定義View)自動翻頁ViewPager
阿新 • • 發佈:2018-12-31
/**
* 描述:自動翻頁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();
}
}