ViewPager实现广告轮播效果

现在主流的App都会有一个轮播的广告图片控件,为了提高自己的能力,决定也来实现一下。经过一天努力,终于实现了。效果如下:

实现方法:ViewPager+Handle
实现过程:

public class MainActivity extends AppCompatActivity {
    private PagerAdapter adapter;
    private ViewPager viewPager;
    private List<View> views;
    private static final int AUTOPLAY = 0;//自动播放
    private static final int MANUALLY = 1;//手机播放
    private Myhandler myhandler;
    private ImageView iv_one, iv_two, iv_three;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv_one = (ImageView) findViewById(R.id.one);
        iv_two = (ImageView) findViewById(R.id.two);
        iv_three = (ImageView) findViewById(R.id.three);
        InitData();
    }

    private void InitData() {
        myhandler = new Myhandler(this);
        GetAdsData data = new GetAdsData(this);
        data.Add(R.drawable.first);
        data.Add(R.drawable.second);
        data.Add(R.drawable.third);
        views = data.GetData();
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        adapter = new PagerAdapter() {
            @Override
            public int getCount() {
                return Integer.MAX_VALUE;//设置Count为无限大,这样就可以模拟实现循环效果

            }


            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {

            }

            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                int location = Math.abs(position);
                //location%viewsize 取余数
                if (views.get(location % views.size()).getParent() != null) {
                    ((ViewPager) views.get(location % views.size())
                            .getParent()).removeView(views.get(location
                            % views.size()));
                }


                (container).addView(views.get(location % views.size()), 0);


                return views.get(location % views.size());

            }

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

        //设置位置为中间位置,防止滑到边界点,
        viewPager.setCurrentItem(Integer.MAX_VALUE / 2);
       //默认为自动轮播模式
        myhandler.sendEmptyMessageDelayed(AUTOPLAY, 5000);

        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                //设置小圆点
                int mark = position % views.size();
                switch (mark) {
                    case 0:
                        iv_three.setImageResource(R.drawable.point_unpress);
                        iv_two.setImageResource(R.drawable.point_unpress);
                        iv_one.setImageResource(R.drawable.point_press);

                        break;
                    case 1:
                        iv_one.setImageResource(R.drawable.point_unpress);
                        iv_two.setImageResource(R.drawable.point_press);
                        iv_three.setImageResource(R.drawable.point_unpress);
                        break;

                    case 2:
                        iv_one.setImageResource(R.drawable.point_unpress);
                        iv_two.setImageResource(R.drawable.point_unpress);
                        iv_three.setImageResource(R.drawable.point_press);

                        break;
                }

            }

            @Override
            public void onPageScrollStateChanged(int state) {
                switch (state) {
                    case ViewPager.SCROLL_STATE_DRAGGING:
                        //当手指碰到ViewPager控件时,发送信息,设置为手动模式
                        myhandler.sendEmptyMessage(MANUALLY);

                        break;

                    case ViewPager.SCROLL_STATE_IDLE:
                        //当手指离开ViewPager时,发送信息,设置为自动模式
                        myhandler.sendEmptyMessageDelayed(AUTOPLAY, 5000);

                        break;
                }

            }
        });
    }


    static class Myhandler extends Handler {
        private WeakReference<MainActivity> weakReference;

        public Myhandler(MainActivity activity) {
            weakReference = new WeakReference<MainActivity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            MainActivity activity = weakReference.get();
            if (activity == null) {

                return;
            }
            if (activity.myhandler.hasMessages(AUTOPLAY)) {
                removeMessages(AUTOPLAY);
            }

            switch (msg.what) {
                case AUTOPLAY://设置自动播放信息
                    activity.viewPager.setCurrentItem(activity.viewPager.getCurrentItem() + 1);

                    break;
                case MANUALLY://接收信息,不做任何处理;

                    break;
            }


        }
    }

关键点:
1.设置监听viewpager的滑动事件,在不同的状态下发送不同的信息给Handler。
2.把PagerAdapter的Count设置为Integer.MAX_VALUE,让边界无限大。
3.用position%view.size,标记每张图片的位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值