輪播圖——你也可以如此簡單


這是在我項目開發中實現輪播圖的一個工具類,在這裏分享下


使用方法:

    private void initData() {
        String[] strings = new String[]{
                "https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=3553847780,477628515&fm=23&gp=0.jpg",
                "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1488891803808&di=f23af05781a6d9d3292e9b0e4b6227f0&imgtype=0&src=http%3A%2F%2Fnews.tom.com%2Fdimg%2F2013%2F0417%2Fimg-1367975148136.jpg",
                "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1488891877354&di=d2867bf2059005d7903755841a5b3e82&imgtype=0&src=http%3A%2F%2Fs0.ifengimg.com%2F2015%2F08%2F24%2Fd2680517a740aa3fe1a6fe750e99b8b5.png"};
        for (int i = 0; i < strings.length; i++) {
            CycleImageBean.DataBean dataBean = new CycleImageBean.DataBean();
            dataBean.setImgUrl(strings[i]);
            imgList.add(dataBean);
        }
        examNoticeVp.setImageResources(imgList, mAdCycleViewListener);//這裏id是輪播圖的id
    }

輪播圖佈局如下:

 <com.text.utils.cycleImage.ImageCycleView
        android:id="@+id/exam_notice_vp"
        android:layout_width="match_parent"
        android:layout_height="@dimen/base150dp"
        android:layout_below="@+id/exam_axalyze_fl"/>

輪播圖工具類

/**
 * auther: anjun
 * create: 2017/1/10 11:07
 * title:  輪播圖工具類
 * description:
 */
public class ImageCycleView extends LinearLayout {

    /**
     * 上下文
     */
    private Context mContext;
    /**
     * 圖片輪播視圖
     */
    private CycleViewPager mBannerPager = null;

    /**
     * 滾動圖片視圖適配器
     */
    private ImageCycleAdapter mAdvAdapter;

    /**
     * 圖片輪播指示器控件
     */
    private ViewGroup mGroup;

    /**
     * 圖片輪播指示器-個圖
     */
    private ImageView mImageView = null;

    /**
     * 滾動圖片指示器-視圖列表
     */
    private ImageView[] mImageViews = null;

    /**
     * 圖片滾動當前圖片下標
     */
    private int mImageIndex = 1;

    /**
     * 手機密度
     */
    private float mScale;

    /**
     * @param context
     */
    public ImageCycleView(Context context) {
        super(context);
    }

    /**
     * @param context
     * @param attrs
     */
    public ImageCycleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        mScale = context.getResources().getDisplayMetrics().density;
        LayoutInflater.from(context).inflate(R.layout.view_banner_content, this);
        mBannerPager = (CycleViewPager) findViewById(R.id.pager_banner);
        mBannerPager.setOnPageChangeListener(new GuidePageChangeListener());
        mBannerPager.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_UP:
                        // 開始圖片滾動
                        startImageTimerTask();
                        break;
                    default:
                        // 停止圖片滾動
                        stopImageTimerTask();
                        break;
                }
                return false;
            }
        });
        // 滾動圖片右下指示器視圖
        mGroup = (ViewGroup) findViewById(R.id.viewGroup);
    }

    /**
     * 裝填圖片數據
     *
     * @param
     * @param imageCycleViewListener
     */
    public void setImageResources(List<CycleImageBean.DataBean> cycleImageData, ImageCycleViewListener imageCycleViewListener) {
        // 清除所有子視圖
        mGroup.removeAllViews();
        // 圖片廣告數量
        final int imageCount = cycleImageData.size();
        mImageViews = new ImageView[imageCount];

        for (int i = 0; i < imageCount; i++) {
            mImageView = new ImageView(mContext);
            int imageParams = (int) (mScale * 20 + 0.5f);// XP與DP轉換,適應不同分辨率
            int imagePadding = (int) (mScale * 5 + 0.5f);
            LinearLayout.LayoutParams layout = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
            layout.setMargins(3, 0, 3, 0);
            mImageView.setLayoutParams(layout);
            mImageView.setPadding(imagePadding, imagePadding, imagePadding, imagePadding);
            mImageViews[i] = mImageView;



            if (i == 0) {
                mImageViews[i].setBackgroundResource(R.mipmap.school_icon_banner);
            } else {
                mImageViews[i].setBackgroundResource(R.mipmap.school_icon_banner_s);
            }
            mGroup.addView(mImageViews[i]);
        }
        mAdvAdapter = new ImageCycleAdapter(mContext, cycleImageData, imageCycleViewListener);
        mBannerPager.setAdapter(mAdvAdapter);


        startImageTimerTask();
    }

    /**
     * 開始輪播(手動控制自動輪播與否,便於資源控制)
     */
    public void startImageCycle() {
        startImageTimerTask();
    }

    /**
     * 暫停輪播——用於節省資源
     */
    public void pushImageCycle() {
        stopImageTimerTask();
    }

    /**
     * 開始圖片滾動任務
     */
    private void startImageTimerTask() {
        stopImageTimerTask();
        // 圖片每3秒滾動一次
        mHandler.postDelayed(mImageTimerTask, 3000);
    }

    /**
     * 停止圖片滾動任務
     */
    private void stopImageTimerTask() {
        mHandler.removeCallbacks(mImageTimerTask);
    }

    private Handler mHandler = new Handler();

    /**
     * 圖片自動輪播Task
     */
    private Runnable mImageTimerTask = new Runnable() {

        @Override
        public void run() {
            if (mImageViews != null) {
                // 下標等於圖片列表長度說明已滾動到最後一張圖片,重置下標
                if ((++mImageIndex) == mImageViews.length + 1) {
                    mImageIndex = 1;
                }
                mBannerPager.setCurrentItem(mImageIndex);
            }
        }
    };

    /**
     * 輪播圖片狀態監聽器
     *
     * @author minking
     */
    private final class GuidePageChangeListener implements ViewPager.OnPageChangeListener {

        @Override
        public void onPageScrollStateChanged(int state) {
            if (state == ViewPager.SCROLL_STATE_IDLE)
                startImageTimerTask(); // 開始下次計時
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageSelected(int index) {

            if (index == 0 || index == mImageViews.length + 1) {
                return;
            }
            // 設置圖片滾動指示器背景
            mImageIndex = index;
            index -= 1;
            mImageViews[index].setBackgroundResource(R.mipmap.school_icon_banner);
            for (int i = 0; i < mImageViews.length; i++) {
                if (index != i) {
                    mImageViews[i].setBackgroundResource(R.mipmap.school_icon_banner_s);
                }
            }

        }

    }

    private class ImageCycleAdapter extends PagerAdapter {

        /**
         * 圖片視圖緩存列表
         */
        private ArrayList<ImageView> mImageViewCacheList;

        /**
         * 圖片資源列表
         */
        private List<CycleImageBean.DataBean> cycleImageData;

        /**
         * 廣告圖片點擊監聽器
         */
        private ImageCycleViewListener mImageCycleViewListener;

        private Context mContext;

        public ImageCycleAdapter(Context context, List<CycleImageBean.DataBean> cycleImage, ImageCycleViewListener imageCycleViewListener) {
            mContext = context;
            cycleImageData = cycleImage;
            mImageCycleViewListener = imageCycleViewListener;
            mImageViewCacheList = new ArrayList();
        }

        @Override
        public int getCount() {
            return cycleImageData.size();
        }

        @Override
        public boolean isViewFromObject(View view, Object obj) {
            return view == obj;
        }

        @Override
        public Object instantiateItem(ViewGroup container, final int position) {
            String imageUrl = cycleImageData.get(position).getImgUrl();


            ImageView imageView = null;
            if (mImageViewCacheList.isEmpty()) {
                imageView = new ImageView(mContext);
                imageView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
                imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

            } else {
                imageView = mImageViewCacheList.remove(0);
            }
            // 設置圖片點擊監聽
            imageView.setOnClickListener(new OnClickListener() {


                @Override
                public void onClick(View v) {
                    mImageCycleViewListener.onImageClick(cycleImageData.get(position),position, v);

                }
            });
            imageView.setTag(imageUrl);
            container.addView(imageView);
            mImageCycleViewListener.displayImage(imageUrl, imageView);
            return imageView;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            ImageView view = (ImageView) object;
            container.removeView(view);
            mImageViewCacheList.add(view);
        }

    }

    /**
     * 輪播控件的監聽事件
     *
     * @author minking
     */
    public static interface ImageCycleViewListener {

        /**
         * 加載圖片資源
         *
         * @param imageURL
         * @param imageView
         */
        public void displayImage(String imageURL, ImageView imageView);

        /**
         * 單擊圖片事件
         *
         * @param imageView
         */
        public void onImageClick(CycleImageBean.DataBean dataBean, int postion, View imageView);
    }

}


輪播圖工具類的adapter


/**
 * auther: anjun
 *create: 2017/1/10 11:03
 * title:  輪播圖工具類的adapter
 * description:
 */
public class CycleViewPager extends ViewPager {

    private InnerPagerAdapter mAdapter;

    public CycleViewPager(Context context) {
        super( context);
        setOnPageChangeListener( null);
    }

    public CycleViewPager(Context context, AttributeSet attrs) {
        super( context, attrs);
        setOnPageChangeListener( null);
    }

    @Override
    public void setAdapter(PagerAdapter arg0) {
        mAdapter = new InnerPagerAdapter( arg0);
        super.setAdapter( mAdapter);
        setCurrentItem(1);
    }

    @Override
    public void setOnPageChangeListener(OnPageChangeListener listener) {
        super.setOnPageChangeListener( new InnerOnPageChangeListener( listener));
    }

    private class InnerOnPageChangeListener implements OnPageChangeListener {

        private OnPageChangeListener listener;
        private int position;

        public InnerOnPageChangeListener(OnPageChangeListener listener) {
            this.listener = listener;
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
            if(null != listener) {
                listener.onPageScrollStateChanged( arg0);
            }
            if(arg0 == ViewPager.SCROLL_STATE_IDLE) {
                if(position == mAdapter.getCount() - 1) {
                    setCurrentItem( 1, false);
                }
                else if(position == 0) {
                    setCurrentItem(mAdapter.getCount() - 2, false);
                }
            }
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
            if(null != listener) {
                listener.onPageScrolled( arg0, arg1, arg2);
            }
        }

        @Override
        public void onPageSelected(int arg0) {
            position = arg0;
            if(null != listener) {
                listener.onPageSelected( arg0);
            }
        }
    }

    private class InnerPagerAdapter extends PagerAdapter {

        private PagerAdapter adapter;

        public InnerPagerAdapter(PagerAdapter adapter) {
            this.adapter = adapter;
            adapter.registerDataSetObserver( new DataSetObserver() {

                @Override
                public void onChanged() {
                    notifyDataSetChanged();
                }

                @Override
                public void onInvalidated() {
                    notifyDataSetChanged();
                }

            });
        }

        @Override
        public int getCount() {
            return adapter.getCount() + 2;
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            return adapter.isViewFromObject( arg0, arg1);
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            if(position == 0) {
                position = adapter.getCount() - 1;
            }
            else if(position == adapter.getCount() + 1) {
                position = 0;
            }
            else {
                position -= 1;
            }
            return adapter.instantiateItem( container, position);
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            adapter.destroyItem( container, position, object);
        }
    }
}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章