您的位置:首页 > 移动开发 > Android开发

Android---universal-image-loader应用

2016-03-11 19:48 218 查看
Universal-Image-loader GitHub源码地址

Universal Image Loader针对图片的加载、缓存、显示提供了强大、灵活的工具,它在图片的加载、缓存过程中提供了许多配置信息供我们选择。

特点:

多线程加载图片

图片的内存缓存或磁盘缓存

对图片的加载和下载过程进行监听,进行事件处理等

图片的来源可以是以下几种:

http://site.com/image.png” // from Web

“file:///mnt/sdcard/image.png” // from SD card

“file:///mnt/sdcard/video.mp4” // from SD card (video thumbnail)

“content://media/external/images/media/13” // from content provider

“content://media/external/video/media/13” // from content provider

(video thumbnail)

“assets://image.png” // from assets

“drawable://” + R.drawable.img // from drawables (non-9patch images)

注意: 当使用drawable格式时,尽量使用原生方式ImageView.setImageResource(…),而不要使用ImageLoader.

新建一个android工程,名为:UniversalImageLoader

导入jar包

在AndroidManifest中添加权限:

<manifest>
<!-- Include following permission if you load images from Internet -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- Include following permission if you want to cache images on SD card -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
</manifest>


4.ImageLoader在使用前,最好在全局Application中进行初始化配置,因此我们要自定义一个Application

public class CustomApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
initImageLoader(getApplicationContext());
}

private void initImageLoader(Context context){

//图片的缓存路径
File cacheDir = StorageUtils.getOwnCacheDirectory(context,"/aa");
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.memoryCache(new LruMemoryCache(20 * 1024 * 1024))
.denyCacheImageMultipleSizesInMemory()
.discCache(new UnlimitedDiskCache(cacheDir))
.diskCacheFileNameGenerator(new Md5FileNameGenerator())
.threadPoolSize(3)
.threadPriority(Thread.NORM_PRIORITY - 2)
.tasksProcessingOrder(QueueProcessingType.FIFO)
.writeDebugLogs()
.build();
ImageLoader.getInstance().init(config);
}
}


5.程序主布局文件activity.main.xml

<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"
tools:context="com.example.universalimageloader.MainActivity" >

<ListView
android:id="@+id/list_img"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:dividerHeight="1dp"
android:divider="#E0E0E0"
/>

</RelativeLayout>


6.ListView单项布局文件list_item.xml

<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="90dp"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="10dp"
android:paddingBottom="10dp"
tools:context="com.example.universalimageloader.MainActivity" >

<ImageView
android:id="@+id/img"
android:layout_width="70dp"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
/>
<TextView
android:id="@+id/tv"
android:layout_toRightOf="@id/img"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="50dp"
android:gravity="center_vertical"
/>

</RelativeLayout>


7.MainActivity.java

public class MainActivity extends Activity {

private ListView list_img;
private List<Map<String,String>>datas = new ArrayList<>();
private String[] images = new String[]{
"http://api.androidhive.info/music/images/adele.png",
"http://img1.imgtn.bdimg.com/it/u=4092462854,1557898995&fm=21&gp=0.jpg",
"http://api.androidhive.info/music/images/eminem.png",
"http://www.ld12.com/upimg358/allimg/c140921/14112A4V34010-219218.jpg",
"http://www.ld12.com/upimg358/allimg/c150619/1434F6225920Z-105122.jpg",
"http://api.androidhive.info/music/images/mj.png",
"http://img0.imgtn.bdimg.com/it/u=4256610768,425170762&fm=21&gp=0.jpg",
"http://gpgxx.nje.cn/JinBo_xscz_gpgxx/Space/uploadfile/photo/20130106201708.jpg",
"http://p.3761.com/pic/88301406163694.jpg",
"http://api.androidhive.info/music/images/rihanna.png",
"http://www.feizl.com/upload2007/2012_06/120617142092295.jpg",
"http://www.ld12.com/upimg358/allimg/c150715/143DPU03IF-5H92.jpg"
};
private String[] strs = new String[]{"item1","item2","item3","item4","item5",
"item6","item7","item8","item9","item10","item11","item12"};
private String[] from = new String[]{"image","strs"};
private int[] to = new int[]{R.id.img,R.id.tv};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

initData();

list_img = (ListView) findViewById(R.id.list_img);
ImageAdapter adapter = new ImageAdapter(this, datas);
list_img.setAdapter(adapter);
}

private void initData(){
for(int i = 0; i < images.length; i++){
Map<String, String>map = new HashMap<>();
map.put("image", images[i]);
map.put("strs", strs[i]);
datas.add(map);
}
}

}


8.图片适配器文件ImageAdapter.java

public class ImageAdapter extends BaseAdapter {

private Context mContext;
private List<Map<String,String>>mDatas = new ArrayList<>();
private LayoutInflater inflater;
private DisplayImageOptions options;
private ImageLoader loader;
private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();

public ImageAdapter(Context context, List<Map<String, String>> datas) {
this.mContext = context;
this.mDatas = datas;
inflater = LayoutInflater.from(context);

loader = ImageLoader.getInstance();
options = new DisplayImageOptions.Builder()
.showImageForEmptyUri(android.R.drawable.ic_delete)
.showImageForEmptyUri(android.R.drawable.ic_menu_share)
.showImageOnFail(R.drawable.ic_launcher)
.cacheInMemory()
.cacheOnDisc()
.displayer(new RoundedBitmapDisplayer(100))
.build();
}

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

@Override
public Object getItem(int position) {
return mDatas.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
convertView = inflater.inflate(R.layout.list_item, parent,false);
holder = new ViewHolder();
holder.img = (ImageView) convertView.findViewById(R.id.img);
holder.tv = (TextView) convertView.findViewById(R.id.tv);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}

loader.displayImage(mDatas.get(position).get("image"), holder.img, options,animateFirstListener);
holder.tv.setText(mDatas.get(position).get("strs"));

return convertView;
}

static class ViewHolder{
private ImageView img;
private TextView tv;
}

/**图片加载监听事件,当图片首次在屏幕上显示时,有一个淡入效果**/
private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {
static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
if (loadedImage != null) {
ImageView imageView = (ImageView) view;
boolean firstDisplay = !displayedImages.contains(imageUri);
if (firstDisplay) {
FadeInBitmapDisplayer.animate(imageView, 500); //设置image隐藏动画500ms
displayedImages.add(imageUri); //将图片uri添加到集合中
}
}
}
}
}


运行截图:



参考:/article/4262501.html

源码下载

更改过后的代码,将ListView每一项的数据用一个实体类来存放。

ItemBean.java

public class ItemBean {

private String img;
private String tv;

public String getImg() {
return img;
}
public void setImg(String img) {
this.img = img;
}
public String getTv() {
return tv;
}
public void setTv(String tv) {
this.tv = tv;
}

}


MainActivity.java修改为:

private ArrayList<Object> itemList;


private void initData() {
itemList = new ArrayList<>();
for (int i = 0; i < strs.length; i++) {
ItemBean item = new ItemBean();
item.setImg(images[i]);
item.setTv(strs[i]);
itemList.add(item);
}
}


ImageAdapter adapter = new ImageAdapter(this, itemList);


适配器修改为:

private ArrayList<Object> itemList;


public ImageAdapter(Context context, ArrayList<Object> itemList) {
this.mContext = context;
this.itemList = itemList;
inflater = LayoutInflater.from(context);
...

}


public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item, parent, false);
holder = new ViewHolder();
holder.img = (ImageView) convertView.findViewById(R.id.img);
holder.tv = (TextView) convertView.findViewById(R.id.tv);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
ItemBean bean = (ItemBean) itemList.get(position);
loader.displayImage(bean.getImg(), holder.img, options,
animateFirstListener);
holder.tv.setText(bean.getTv());

return convertView;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: