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

相關文章
相關標籤/搜索