android ViewPager 轮播图的实现

原理很简单,发送一个延迟消息就能够了,具体说明看代码:java

universal-imageloader 进行的图片加载;
android

MainActivity:
网络

package com.hong.autoshowpager;

import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    ViewPager viewPager;
    private MyViewPager adapter;

    private ArrayList<String> showImages;//网络数据(图片的url)
    private DisplayImageOptions options;//加载图片的option设置(universal-imageloader框架)

    /**
     * 自动轮播效果;
     */
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    int currentItem = viewPager.getCurrentItem();//获取当前pager的position
                    viewPager.setCurrentItem(currentItem + 1);//收到消息后,播放下一张
                    removeCallbacksAndMessages(null);//移除消息回调
                    sendEmptyMessageDelayed(1, 3000);//再次发送播放下一张的消息;
                    break;
            }
        }
    };
    private MyOnPageChangeListener myOnPageChangeListenr;
    int currentPosition;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        options = new DisplayImageOptions.Builder()//option的设置
                .showImageOnLoading(R.drawable.ic_launcher)
                .cacheOnDisk(true)
                .cacheInMemory(true)
                .build();

        viewPager = (ViewPager) findViewById(R.id.viewpager);

        showImages = ContentUtils.getShowImages();//从数据类里面得到播放的图片数据
        currentPosition = showImages.size() * 2000;//设置初始化时显示第 currentPosition 页;能够设置很大显示position值
        adapter = new MyViewPager();

        viewPager.setCurrentItem(currentPosition);//设置到 currentPosition 的页面
        myOnPageChangeListenr = new MyOnPageChangeListener();


        viewPager.setAdapter(adapter);
        viewPager.addOnPageChangeListener(myOnPageChangeListenr);//给viewPager设置监听事件
        handler.sendEmptyMessageDelayed(1, 3000);//发送延迟消息,每3秒播放下一张

    }

    /**
     * 适配器
     */
    private class MyViewPager extends PagerAdapter {
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View pager1 = View.inflate(getApplicationContext(), R.layout.item_pager, null);
            ImageView imageView = (ImageView) pager1.findViewById(R.id.item_imageview);

            //对Position进行取模,由于 getCount() 方法里面返回的数量是很大的;不然会 OutOfIndexException 错误
            ImageLoader.getInstance().displayImage(showImages.get(position % showImages.size()), imageView, options);
            container.addView(pager1);
            return pager1;
        }

        @Override
        public int getCount() {
            return showImages.size() * 5000;//固然也能够写成:Integer.MAX_VALUE; 随你心情;

        }

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

    /**
     * 实现监听的类
     * 在拖拽状态时不进行轮播
     */
    private class MyOnPageChangeListener implements ViewPager.OnPageChangeListener {

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

        }

        @Override
        public void onPageSelected(int position) {

        }

        @Override
        public void onPageScrollStateChanged(int state) {
            if (state == ViewPager.SCROLL_STATE_DRAGGING) {//在 拖拽 的时候移除消息回调
                handler.removeCallbacksAndMessages(null);
            } else if (state == ViewPager.SCROLL_STATE_SETTLING) {//在 松手复位 的时候从新发送消息
                handler.sendEmptyMessageDelayed(1, 3000);
            } else if (state == ViewPager.SCROLL_STATE_IDLE) {//在 空闲 时候发送消息
                handler.sendEmptyMessageDelayed(1, 3000);
            }
        }
    }
}


ContentUtils:app

private static String[] showImages = {
        "http://wimg.spriteapp.cn/ugc/2016/04/01/56fdfa2133add_1.jpg",
        "http://wimg.spriteapp.cn/ugc/2015/12/20/5675e6ea806e0_a_1.jpg",
        "http://wimg.spriteapp.cn/ugc/2016/04/01/56fdfd7d9483f_a_1.jpg"
};

public static ArrayList<String> getShowImages() {
    ArrayList<String> images = new ArrayList<>();
    for (int i = 0; i < showImages.length; i++) {
        images.add(showImages[i]);
    }
    return images;
}

不要忘了 添加权限。框架

demo地址: http://download.csdn.net/download/qq_33363534/9480283ide

相关文章
相关标签/搜索