(自定义View)自动翻页ViewPager

来源:互联网 发布:手机科幻特效软件 编辑:程序博客网 时间:2024/06/04 17:59
/** * 描述:自动翻页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();    }}