使用Universal-Image-Loader加载图片

        在请求图片时,往往会涉及到对图片的二次采样处理,包括图片的大小,显示的样式(圆角,矩形),甚至时缓存处理,相信大家也接触过很多类似的需求,个人感觉Universal-Image-Loader在这方面做的还是比较人性化的,不需要开发者去做过段繁琐的代码操作,简单易用,所以今天打算跟大家分享下这款强大的图片加载框架,其实图片请求框架网上好多,个人感觉用熟一个就行,其他一通百通,没必要把所有的都搞一遍,题外话到此截止,接下来进入正文,我由浅入深都跟大家分享下universal-image-loader的具体使用细节,在文章的最后我会为大家简单封装一个图片请求的工具类,供大家参考。


我把整个过程细分成四步,然后在每一步分别为大家讲解下要做的工作。

第一步:导包引资源还有配置网络权限我就不具体说了,这个留给大家自己来做

第二步:接下来也是比较重要的一步,配置全局的ImageLoaderConfigraution参数,参数配置全局有效,建议放在Application里面配置,如多次配置默认使用的是第一次的配置参数:

         一般我会把这一初始化的过程放在Application里面,全局使用,对于需要展示不同样式的图片风格可以在dispalyImage方法中通过传入不同的options来处理,不传入options的话,则使用默认的options展示样式。

// 创建默认的ImageLoader配置参数
        DisplayImageOptions defaultOptions = new DisplayImageOptions
                .Builder()
                .cacheInMemory(true)
                .cacheOnDisk(true)
                .build();

        ImageLoaderConfiguration configuration = new ImageLoaderConfiguration
                .Builder(mAppContext)
                .defaultDisplayImageOptions(defaultOptions)
                .threadPriority(Thread.NORM_PRIORITY - 2)
                .diskCacheFileNameGenerator(new Md5FileNameGenerator())
                .tasksProcessingOrder(QueueProcessingType.LIFO)
                .build();

        

第三步:配置完参数接下来要做的工作初始化ImageLoader

ImageLoader.getInstance().init(configuration);


第四步:配置option,这一步如果你加载图片没特殊要求可忽略。因为我们在application已经对Imageloader配置来默认的option,不做处理的话采用application中配置的option,如果有特殊要求,那么这一步就必不可少了,加载图片时把你新配置的option传进去就好了。我演示下加载圆角图片跟默认不做处理图片加载示例。

1.显示圆角

//显示圆角
        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .cacheInMemory(true)
                .cacheOnDisk(true)
                .displayer(new RoundedBitmapDisplayer(360))   //设置展示的样式
                .build();
        ImageLoader.getInstance().displayImage(url, this,options);

2.默认不处理,采用我们在application中配置的option,在display的时候不传入option,采用的就是application中配置的默认样式。

ImageLoader.getInstance().displayImage(url, this);


接下来我给大家贴上一段完整的代码,分别加载了三种不同样式的图片。

public class MainActivity extends AppCompatActivity {

    private ImageView imageView1, imageView2, imageView3;
    private ImageLoader mImageLoader;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mImageLoader = ImageLoader.getInstance();   //这一步操作最好放在基类里
        imageView1 = (ImageView) findViewById(R.id.imageview1);
        imageView2 = (ImageView) findViewById(R.id.imageview2);
        imageView3 = (ImageView) findViewById(R.id.imageview3);


        //ImageLoaderConfiguration已在application中配置好,要展示不同样式的图片只需设置不同的option即可
        //其他参数我不设置了,为了演示代码我只设置展示图片的圆角样式
        DisplayImageOptions options1 = new DisplayImageOptions.Builder()
                .displayer(new RoundedBitmapDisplayer(0))
                .build();
        mImageLoader.displayImage("url_1", imageView1, options1);


        DisplayImageOptions options2 = new DisplayImageOptions.Builder()
                .displayer(new RoundedBitmapDisplayer(30))
                .build();
        mImageLoader.displayImage("url_2", imageView2, options2);


        DisplayImageOptions options3 = new DisplayImageOptions.Builder()
                .displayer(new RoundedBitmapDisplayer(360))
                .build();
        mImageLoader.displayImage("url_2", imageView3, options3);

    }
}



最后我简单封装了一个图片请求的工具类,支持对图片的二次采样大小,以及显示样式,是否启用缓存等操作,供大家参考。

package com.zhuandian.msuic;

import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.widget.ImageView;

import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener;

/**
 * Created by 谢栋  on 2016/12/25.
 */
public class UniversalImageLoader {

    /**
     * 通过传入的url下载图片并显示在ImageVIew上
     *
     * @param context   上下文
     * @param url       请求图片的url
     * @param imageView 要显示图片的ImageView控件
     */
    public static void getImage(Context context, String url, ImageView imageView) {

        //1.简单得到一张未处理的图片,使用默认的ImageLoaderConfiguration
//        ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(context));
//        ImageLoader.getInstance().displayImage(url,imageView);

        //2.使用自定义配置的ImageLoaderConfiguration修改图片的显示样式,启用缓存等...

        //设置图片展示的配置,是否qiy启用缓存,图片显示的样式(圆角,方角)
        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .cacheInMemory(true)  //启用二级缓存 (检测内存中是否有改图片存在)
                .cacheOnDisk(true)    //启用磁盘缓存 (检测磁盘中是否有改图片存在)
                .displayer(new RoundedBitmapDisplayer(50))   //设置展示的样式
                .build();
        ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)
//                .memoryCacheSize(5*1024*1024)  //设置二级缓存(内存缓存)的指定大小
                .memoryCacheSizePercentage(20)   //设置内存缓存占有的百分比
                .diskCacheFileCount(80)          //设置允许缓存的图片数量,当大于指定数量时会删除一部分
                .diskCacheSize(5 * 1024 * 1024)  //设置磁盘缓存的大小
//                .defaultDisplayImageOptions(DisplayImageOptions.createSimple())  //设置图片展示的模式(默认不做任何处理)
                .defaultDisplayImageOptions(options)
                .build();

        ImageLoader.getInstance().init(configuration);   //传入自定义的ImageLoaderConfiguration
        ImageLoader.getInstance().displayImage(url, imageView);
        ImageLoader.getInstance().displayImage(url, imageView, options, new ImageLoadingListener() {
            //            设置监听事件
            @Override
            public void onLoadingStarted(String imageUri, View view) {

            }

            @Override
            public void onLoadingFailed(String imageUri, View view, FailReason failReason) {

            }

            @Override
            public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {

            }

            @Override
            public void onLoadingCancelled(String imageUri, View view) {

            }
        }, new ImageLoadingProgressListener() {

            //监听进度比
            @Override
            public void onProgressUpdate(String imageUri, View view, int current, int total) {

            }
        });
    }


}

       其实Universal-Image-Loader还是比较强大的,主要支持的功能有一下几个方面

  1. 多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等
  2. 支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置
  3. 支持图片的内存缓存,文件系统缓存或者SD卡缓存
  4. 支持图片下载过程的监听
  5. 根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存
  6. 较好的控制图片的加载过程,例如暂停图片加载,重新开始加载图片,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片
  7. 提供在较慢的网络下对图片进行加载

当然我贴上的代码只是简单的用法之一,大家在实际项目开发中可以根据需求自己来定制相应的功能,其他一些用法跟具体细节还是需要大家自己动手去尝试下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值