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

效果图

这里写图片描述

思考

  • 要实现上面的效果,布局上使用viewpager控件,还需一个textview用来显示文字,一个LinearLayout用来存放动态创建的小圆点。
  • 用handler隔几秒发送一个消息来控制图片的轮播切换。
  • 要使在最后一张图片继续左滑时,跳到第一张图片上,可以将viewpager适配器中的getCount()方法中返回最大的整数,在instantiateItem中通过对list的长度取模来设置当前的页。(不要忘了在获取viewpager的currentItem时也要进行取模操作)
  • 要使第一张图片右滑时,跳到最后一张图片上,可以在初始化数据后,设置viewpager的currentItem为整数最大值的一半。但这时可能会造成进入时viewpager不在第一个页面,解决办法也很简单:用最大值的一半模上数据集合的大小,这个值就是多出来的页数的值,减去这个值就可以。(viewPager.setCurrentItem(Integer.MAX_VALUE/2 - Integer.MAX_VALUE/2%list.size());

步骤

  1. 布局文件

    主页面布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="200dip" >
    </android.support.v4.view.ViewPager>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@id/viewpager"
        android:background="#7000"
        android:orientation="vertical"
        android:gravity="center_horizontal"
        android:padding="4dip" >

        <TextView
            android:id="@+id/tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="文本内容"
            android:textColor="#fff" />

        <LinearLayout
            android:id="@+id/points"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:paddingTop="4dip" >

        </LinearLayout>
    </LinearLayout>

</RelativeLayout>
viewpager适配器的item布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/iv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitXY"
        android:src="@drawable/a" />

</LinearLayout>
  1. 主函数
public class MainActivity extends Activity {

    public static final int DELAY_Millis = 5000;
    private ViewPager viewPager;
    private TextView textView;
    private LinearLayout points;
    private List<Data> list = new ArrayList<Data>();
    private Handler handler = new Handler(){
        public void handleMessage(android.os.Message msg) {
            viewPager.setCurrentItem(viewPager.getCurrentItem()+1);
            handler.sendEmptyMessageDelayed(0, DELAY_Millis);
        };
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initViews();
        initListeners();
        initData();
    }

    private void initViews() {
        setContentView(R.layout.activity_main);
        viewPager = (ViewPager) this.findViewById(R.id.viewpager);
        textView = (TextView) this.findViewById(R.id.tv);
        points = (LinearLayout) this.findViewById(R.id.points);
    }

    private void initListeners() {
        viewPager.setOnPageChangeListener(new OnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                updatePointAndText();
            }

            @Override
            public void onPageScrolled(int position, float positionOffset,
                    int positionOffsetPixels) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

    private void initData() {
        list.add(new Data(R.drawable.a, "巩俐不低俗,我就不能低俗"));
        list.add(new Data(R.drawable.b, "朴树又回来了,再唱经典老歌引百万人同唱啊"));
        list.add(new Data(R.drawable.c, "揭秘北京电影如何升级"));
        list.add(new Data(R.drawable.d, "乐视网TV版大放送"));
        list.add(new Data(R.drawable.e, "热血屌丝的反杀"));
        initPoints();
        viewPager.setAdapter(new MyAdapter());
        viewPager.setCurrentItem(Integer.MAX_VALUE/2 - Integer.MAX_VALUE/2%list.size()); 
        updatePointAndText();
        handler.sendEmptyMessageDelayed(0, DELAY_Millis);
    }

    private void initPoints() {
        for (int i = 0; i < list.size(); i++) {
            View view = new View(this);
            LayoutParams params = new LayoutParams(DensityUtils.dip2px(this, 5), DensityUtils.dip2px(this, 5));
            if (i != 0) {
                params.leftMargin = DensityUtils.dip2px(this, 5);
            }
            view.setLayoutParams(params);
            view.setBackgroundResource(R.drawable.selector_points);
            points.addView(view);
        }
    }

    private void updatePointAndText() {
        int currentItem = viewPager.getCurrentItem()%list.size();
        for (int i = 0; i < points.getChildCount(); i++) {
            points.getChildAt(i).setEnabled(currentItem == i);
        }
        textView.setText(list.get(currentItem).getPicdesc());
    }

    class MyAdapter extends PagerAdapter {
        @Override
        public int getCount() {
            return Integer.MAX_VALUE;
        }

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

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View view = View.inflate(MainActivity.this, R.layout.adapter_view,
                    null);
            ImageView iv = (ImageView) view.findViewById(R.id.iv);
            Data data = list.get(position%list.size());
            int picId = data.getPicId();
            iv.setImageResource(picId);
            container.addView(view);
            return view;
        }

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

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值