Android動態輪播焦點圖
之前寫過一個簡單的輪播焦點圖demo:Android 輪播焦點圖簡單實現,實現的功能比較簡單,每一個輪播要單獨寫一個fragment,設置xml佈局然後配置圖片地址,昨天一個程序媛朋友提到要用網絡圖片來製作輪播焦點圖.如果要像這樣根據後臺動態修改輪播的話,首先數量不確定,其次每一張圖片都要建一個頁面,修改起來也顯得死板,並且不利於性能優化,於是寫了一個工具類來幫助我們完成這些繁瑣的操作,下面來看看代碼:
首先是工具類 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;
}
/**
* 設置你的輪播畫面viewpager的xml佈局文件裏面的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的主java的Activity
* @param imgs 這個是要傳的所有網絡圖片的String數組
* @param imageView 這個是你的xml文件中的圖片的控件,
* 例如:ImageView imageView = (ImageView)findViewById(R.id.image_view)
* @param resources 放圖片的xml的layout 例如:R.layout.xxx
* @param viewPager 繼承FragmentActivity的主java的Activity的xml中的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);
//每次循環添加一個banners到map中
for (int i = 0; i < imgs.length; i++) {
//給每個實例化的一個唯一標識
Integer bannerNames = i;
//這裏 前面這個是每個new的banners的唯一標識,後面是實例化的Banners;
map.put(bannerNames, new Banners(imgs[i]));
}
/*
爲了管理Activity中的fragments,需要使用FragmentManager.爲了得到它,
需要調用Activity中的getFragmentManager()方法。
因爲FragmentManager的API是在 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>
以上就是完整的例子展示了,其中可擴展的地方還很多,當然也有很多不足之處,如果有什麼意見或者疑問的話可以在私信或者評論,大家一起交流討論一番.