Android 广告轮播(伪无限循环)

来源:互联网 发布:java api接口编写实例 编辑:程序博客网 时间:2024/06/06 20:26

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);// 将广告设置为中间,这样才能能两边无限循环

源代码

源代码链接

0 0