您的位置:首页 > 移动开发 > Android开发

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

2015-06-04 12:00 363 查看

效果图



思考

要实现上面的效果,布局上使用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());


步骤

布局文件

主页面布局:

<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>


主函数

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);
        }
    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: