三行代碼實現一個輪播 BannerView

qnda5002 7年前發布 | 7K 次閱讀 安卓開發 Android開發 移動開發

自己簡單封裝了一個帶hint的輪播ViewPager,用來展示app首頁的Banner,先看效果圖吧。

使用起來非常方便~~2至3行代碼就能實現上述效果,只要傳入一個list就可以(其中是你需要展示的ImageView),當然也可以自己在這基礎上添加各種Transform動畫。

bannerView = (BannerView) findViewById(R.id.banner);
        bannerView.setViewList(viewList);
        bannerView.startLoop(true);

實現原理相信大家應該都知道,就是可能懶得去封裝這種東西。

具體思路:

    1. 繼承自FrameLayout,在下層填充一個ViewPager
  • 2.根據ViewPager的itemCount去動態生成底部hint小圓點

if (mLinearPosition.getChildCount() != viewSize) {
                int diffCnt = mLinearPosition.getChildCount() - viewSize;
                boolean needAdd = diffCnt < 0;
                diffCnt = Math.abs(diffCnt);
                for (int i = 0; i < diffCnt; i++) {
                    if (needAdd) {
                        ImageView img = new ImageView(getContext());
                        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                        layoutParams.rightMargin = getResources().getDimensionPixelOffset(R.dimen.dimen_9dp);
                        img.setLayoutParams(layoutParams);
                        img.setBackgroundResource(R.drawable.banner_point);
                        mLinearPosition.addView(img);
                    } else {
                        mLinearPosition.removeViewAt(0);
                    }
                }
            }
  • 3.通過Handler去控制輪播的頻率,重新設置ViewPager的currentItem以及hint小圓點的背景
private static class BannerHandler extends Handler {
        private WeakReference<BannerView> weakReference = null;

        public BannerHandler(BannerView bannerView) {
            super(Looper.getMainLooper());
            this.weakReference = new WeakReference<BannerView>(bannerView);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (this.weakReference == null) {
                return;
            }
            BannerView bannerView = this.weakReference.get();
            if (bannerView == null || bannerView.mViewPager == null || bannerView.mViewPager.getAdapter() == null || bannerView.mViewPager.getAdapter().getCount() <= 0) {
                sendEmptyMessageDelayed(MSG_LOOP, LOOP_INTERVAL);
                return;
            }
            int curPos = bannerView.mViewPager.getCurrentItem();
            curPos = (curPos + 1) % bannerView.mViewPager.getAdapter().getCount();
            bannerView.mViewPager.setCurrentItem(curPos);
            sendEmptyMessageDelayed(MSG_LOOP, LOOP_INTERVAL);
        }
    }
  • 4.具體細節,如無限輪播adapter的創建,handler中的弱引用,啟動銷毀loop等等

 

 

項目主頁:http://www.baiduhome.net/lib/view/home/1490082409129

 

 本文由用戶 qnda5002 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!