Android動態輪播焦點圖

Android動態輪播焦點圖


    轉載請註明出處:http://blog.csdn.net/qq_21806653/article/details/50408279


之前寫過一個簡單的輪播焦點圖demo:Android 輪播焦點圖簡單實現,實現的功能比較簡單,每一個輪播要單獨寫一個fragment,設置xml佈局然後配置圖片地址,昨天一個程序媛朋友提到要用網絡圖片來製作輪播焦點圖.如果要像這樣根據後臺動態修改輪播的話,首先數量不確定,其次每一張圖片都要建一個頁面,修改起來也顯得死板,並且不利於性能優化,於是寫了一個工具類來幫助我們完成這些繁瑣的操作,下面來看看代碼:


源碼免積分下載地址: http://download.csdn.net/download/qq_21806653/9378071


  首先是工具類 UrlImageHelper.java

package com.learn.fei.autoscroll;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.nostra13.universalimageloader.core.ImageLoader;

import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

/**
 * 使用此工具類的方法:
 * 準備工作:
 * ①/導入Image_Loderjar/
 * ②/AndroidManifest中配置權限:
 * <uses-permission android:name="android.permission.INTERNET" />
 * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 * ③/新建MyApplication配置Imageloder適配器
 * ④/AndroidManifest中在Application中加入name屬性/
 * 正式使用:
 * 1,調用setImg方法,傳入對應參數
 * 2,在需要的地方調用 autoScroll方法開始線程
 * 3,在需要停止的調用stopAutoScroll方法停止自動滾動的線程
 * Created by fei on 2015/12/25.
 */
public class UrlImageHelper {
    private static Timer timer;
    //初始banner下標
    private static int bannerCount = 0;
    //製作fragment工廠的xml.例如:R.layout.xxx
    private static int resource;
    //製作fragment工廠的xml裏的ImageView的控件
    private static int imageView;
    //網絡圖片url數組
    private static String[] imgs;
    //viewpager
    private static ViewPager viewPager;

    //get set傳入的viewpager
    public static ViewPager getViewPager() {
        return viewPager;
    }

    public static void setViewPager(ViewPager viewPager) {
        UrlImageHelper.viewPager = viewPager;
    }

    //get set網絡圖片url數組
    public static String[] getImgs() {
        return imgs;
    }

    public static void setImgs(String[] imgs) {
        UrlImageHelper.imgs = imgs;
    }

    /**
     * 設置你的輪播畫面的xml佈局文件,需要內部包含一個ImageView
     *
     * @param resource 這個是你的xml文件,例如:R.layout.banner.xml
     */
    public static void setResource(int resource) {
        UrlImageHelper.resource = resource;
    }


    public static int getResource() {
        return resource;
    }

    /**
     * 設置你的輪播畫面viewpagerxml佈局文件裏面的ImageView控件
     *
     * @param imageView 這個是你的xml文件中的圖片的控件,例如:View view = findViewById(R.id.image_view);
     */
    public static void setImageView(int imageView) {

        UrlImageHelper.imageView = imageView;
    }


    public static int getImageView() {
        return imageView;
    }


    /**
     * 每一個fragment滾動畫面的工廠方法
     */
    public static class Banners extends Fragment {
        private View parent;
        private ImageView img;
        private String imgUrl;

        public Banners(String imgUrl) {
            this.imgUrl = imgUrl;
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            parent = LayoutInflater.from(getActivity()).inflate(getResource(), container, false);
            img = (ImageView) parent.findViewById(getImageView());

            ImageLoader.getInstance().displayImage(imgUrl, img);
            return parent;
        }
    }

    /**
     * 這個方法用於迭代你的圖片url數組,然後給每個圖片實例一個fragment.
     *
     * @param fragmentActivity 這個是繼承FragmentActivity的主javaActivity
     * @param imgs             這個是要傳的所有網絡圖片的String數組
     * @param imageView        這個是你的xml文件中的圖片的控件,
     *                         例如:ImageView imageView = (ImageView)findViewById(R.id.image_view)
     * @param resources        放圖片的xmllayout 例如:R.layout.xxx
     * @param viewPager        繼承FragmentActivity的主javaActivityxml中的viewPager控件
     */
    public static void setImg(FragmentActivity fragmentActivity, String[] imgs, int imageView, int resources, ViewPager viewPager) {

        //設置fragment工廠的xml
        setResource(resources);
        //設置fragment工廠的中的ImageView控件
        setImageView(imageView);
        //創建一個map集合存儲
        Map<Integer, Banners> map = new HashMap<>();
        //設置imgs
        setImgs(imgs);
        //設置viewPager
        setViewPager(viewPager);

        //每次循環添加一個bannersmap        for (int i = 0; i < imgs.length; i++) {
            //給每個實例化的一個唯一標識
            Integer bannerNames = i;
            //這裏 前面這個是每個newbanners的唯一標識,後面是實例化的Banners;
            map.put(bannerNames, new Banners(imgs[i]));
        }
            /*
            爲了管理Activity中的fragments,需要使用FragmentManager.爲了得到它,
            需要調用Activity中的getFragmentManager()方法。
            因爲FragmentManagerAPI是在 Android 3.0,也即API level 11開始引入的,
            所以對於之前的版本,需要使用support library中的FragmentActivity            並且使用getSupportFragmentManager()方法。
            */
        //如果多層嵌套fragment這裏變成:manager = getChildFragmentManager();
        FragmentManager manager = fragmentActivity.getSupportFragmentManager();


        //調用viewpager適配器
        MyPagerAdapter myPagerAdapter = new MyPagerAdapter(manager, map);
        viewPager.setAdapter(myPagerAdapter);

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

            }

            @Override
            public void onPageSelected(int position) {
                //滑動後調用initFocus改變其視圖
                initFocus(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });


    }

    /**
     * 自動滾動的方法
     *
     * @param howWaitScroll 延遲多久啓動(秒爲單位)
     * @param howLongScroll 多久秒滾動一次(秒爲單位)
     */
    public static void autoScroll(int howWaitScroll, int howLongScroll) {
        int howLongScrollS = howLongScroll * 1000;
        int howWaitScrollS = howWaitScroll * 1000;
        timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {

                //滾動邏輯
                if (bannerCount < UrlImageHelper.getImgs().length - 1) {
                    bannerCount = getViewPager().getCurrentItem();
                    bannerCount++;
                } else {
                    bannerCount = 0;
                }
                //發送消息給handler
                Message message = mHandler.obtainMessage();
                message.what = 1001;
                message.obj = bannerCount;
                mHandler.sendMessage(message);
            }

        };
        timer.schedule(task, howWaitScrollS, howLongScrollS);
    }


    public static void stopAutoScroll() {
        timer.cancel();
    }


    /**
     * handler接收消息並交給initFocus方法處理
     */
    public static Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            if (msg.what == 1001) {
                int count = (int) msg.obj;
                initFocus(count);
            }
        }
    };

    /**
     * 這個是滑動後顯示當前傳入count的下標的輪播畫面
     * 之所以提出來是增強擴展性,如果要加入輪播下面的小焦點或者加入文字的話,
     * 都可以在這裏面初始化並根據count改變內容
     *
     * @param count 你要顯示的輪播子頁面的下標
     */
    public static void initFocus(int count) {

        getViewPager().setCurrentItem(count);
    }


}

/**
 *  fragment的自定義適配器
 */
class MyPagerAdapter extends FragmentStatePagerAdapter {
    private Map<Integer, UrlImageHelper.Banners> map;

    public MyPagerAdapter(FragmentManager fm, Map<Integer, UrlImageHelper.Banners> map) {
        super(fm);
        this.map = map;
    }

    @Override
    public Fragment getItem(int position) {
        return map.get(position);
    }

    @Override
    public int getCount() {
        return map.size();
    }
}









下面是演示的例子:

主java文件: MainActivity.java

package com.learn.fei.autoscroll;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;

public class MainActivity extends FragmentActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ViewPager viewPger = (ViewPager) findViewById(R.id.banner_pager);
        //模擬數據源    
        String[] ImageUrls ={"http://f.hiphotos.baidu.com/zhidao/pic/item/1ad5ad6eddc451dac40eaa9ab6fd5266d11632c2.jpg"
                ,"http://g.hiphotos.baidu.com/zhidao/pic/item/9f510fb30f2442a797a55138d043ad4bd0130287.jpg"
                ,"http://b.hiphotos.baidu.com/zhidao/pic/item/241f95cad1c8a786e003f0d66509c93d70cf5038.jpg"
                ,"http://attachments.gfan.com/forum/attachments2/day_111015/11101516078db7b14d1d8ebe71.jpg"
                ,"http://pic.33.la/zmbz/katong/dies%20iraed_35951.jpg"
                ,"http://imgsrc.baidu.com/forum/pic/item/54fbb2fb43166d22c3cd8c09462309f79152d2f1.jpg"};

        
        //傳入對應參數
        UrlImageHelper.setImg(MainActivity.this, ImageUrls, R.id.image_view, R.layout.view_pager, viewPger);

        //設置開始的延遲和滾動間隔秒數(秒爲單位)
        UrlImageHelper.autoScroll(2,2);
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        //設置什麼時候停止滾動的這個線程
        UrlImageHelper.stopAutoScroll();
    }
}


Application的配置文件: MyApplication.java 

package com.learn.fei.autoscroll;

import android.app.Application;

import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;

/**
 *
 * Created by fei on 2015/12/8.
 */
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //****************
        DisplayImageOptions options = new DisplayImageOptions.Builder()
//                .showImageOnFail(R.drawable.add_photo_default)
//                .showImageOnLoading(R.drawable.add_photo_default)
                        //圖片顯示大小恰好
                .imageScaleType(ImageScaleType.EXACTLY)
                .cacheInMemory(true)
                .cacheOnDisk(true)
                .build();
        ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this)
//                    .memoryCacheExtraOptions(480,720)
                .defaultDisplayImageOptions(options)
                .build();
        ImageLoader.getInstance().init(configuration);
        ///**************

    }
}


配置完成後需要在manifests配置文件的Application標籤中加入name屬性:

	android:name=".MyApplication"

在manifests中添加權限:

	<uses-permission android:name="android.permission.INTERNET" />
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

        xml佈局:

主mainActivity的佈局xml: main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<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:background="#8dc178"
tools:context=".MainActivity">

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

</RelativeLayout>

viewPager的佈局xml: view_pager.xml


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

    <ImageView
        android:id="@+id/image_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>




  以上就是完整的例子展示了,其中可擴展的地方還很多,當然也有很多不足之處,如果有什麼意見或者疑問的話可以在私信或者評論,大家一起交流討論一番.









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章