Android 廣告輪播(僞無限循環)

0. 效果圖

這裏寫圖片描述

1. 填充數據,ViewPager實現

用一個javabean來封裝數據,

// 加載適配器
vpContainer.setAdapter(new MyAdapter());

2. 動態添加標題

onPageChangeListener()來監聽ViewPager的事件來改變標題

/**
     * 監聽ViewPager的滑動,來動態改變標題
     * 
     * @author admin
     * 
     */
    class MyPagerChangeListener implements OnPageChangeListener {

        @Override
        public void onPageScrollStateChanged(int arg0) {

        }

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

        }

        @Override
        public void onPageSelected(int arg0) {
            initTitleAndDot();
        }

        private void initTitleAndDot() {
            int currentPosition = vpContainer.getCurrentItem() % ads.size();
            tvTitle.setText(ads.get(currentPosition).getTitle());
            // 設置當前獲取焦點的dot
            for (int i = 0; i < llDotContainer.getChildCount(); i++) {
                llDotContainer.getChildAt(i).setSelected(currentPosition == i);
            }
        }

    }

3. 添加指示點

根據廣告的數量來往指示點容器裏添加dot

// 根據廣告的數量來動態添加dot
        for (int i = 0; i < ads.size(); i++) {
            View child = new View(this);
            // TODO LayoutParams的使用
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(8,
                    8);
            if (i != 0) {
                params.leftMargin = 5;
            }
            child.setBackgroundResource(R.drawable.selector_dot);
            child.setLayoutParams(params);
            llDotContainer.addView(child);
        }

dot的狀態用selector來控制

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_selected="true" android:drawable="@drawable/shape_dot_focus"></item>
    <item android:state_selected="false" android:drawable="@drawable/shape_dot_unfocus"></item>

</selector>

4. 自動切換

利用handler來實現

// 實現廣告自動切換
    private Handler mHandler = new Handler() {
        public void handleMessage(android.os.Message msg) {

            vpContainer.setCurrentItem(vpContainer.getCurrentItem() + 1);
            // 類似迭代實現自動切換功能
            mHandler.sendEmptyMessageDelayed(0, 3000);
        };
    };


// 自動切換,利用handler實現
// 每個3秒切換一次
mHandler.sendEmptyMessageDelayed(0, 3000);

5. 無限循環

根據PagerAdpater的getCount()方法,
將返回的view的數量設置爲Integer.MAX_VALUE
這樣來實現僞無限循環。

    /**
     * ViewPager的適配器
     * 
     * @author admin
     * 
     */
    class MyAdapter extends PagerAdapter {

        @Override
        public int getCount() {
            // return ads.size();
            return Integer.MAX_VALUE;
        }

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

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

        @Override
        public Object instantiateItem(ViewGroup container, int position) {

            ImageView ivImage = new ImageView(MainActivity.this);
            ivImage.setImageResource(ads.get(position % ads.size()).getImage());
            ivImage.setScaleType(ScaleType.FIT_XY);
            container.addView(ivImage);
            return ivImage;
        }

    }



        int count = Integer.MAX_VALUE / 2 % ads.size();// 當前頁與第一頁的差值
        vpContainer.setCurrentItem(Integer.MAX_VALUE / 2 - count);// 將廣告設置爲中間,這樣才能能兩邊無限循環

源代碼

源代碼鏈接

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