Universal-Image-Loader 的封装和使用示例

重点

单例写法=>枚举

通用性考虑

性能考虑

Universal-Image-Loader 已经实现的特殊效果

圆角图片 (RoundedBitmapDisplayer(int cornerRadiusPixels))

圆形图片 (CircleBitmapDisplayer())

圆环图片 ( CircleBitmapDisplayer(Integer strokeColor, float strokeWidth))

现在各种大神层出不穷,轮子越来越多,造就一个好用的轮子需要花费很多精力,而对于更多的开发人员来说,如何更好地利用现有的轮子,显然是更具有意义的一个话题。

Universal-Image-Loader 是用的比较多的一个图片加载的第三方库,我个人经历的项目中,很多也使用了Universal-Image-Loader 作为网络图片加载的解决方案。

整体来说Universal-Image-Loader还是比较好用的,能满足基本的图片加载场景的使用。

本文,从封装的角度简要的介绍一下Universal-Image-Loader的使用。

之前经历过的项目中很多使用Universal-Image-Loader 只是随意写,每个使用的地方进行一次初始化、单独配置,这其实没有太大必要,整理一下工程中使用的场景不外乎集中,最好使用单例的形式封装成通用的工具类。

单例的写法,有很多种,懒汉式、饿汉式、双重校验锁,不过从各种写法中,发现比较公认的终极单例写法是使用枚举的方式。本例就使用枚举的方式,实现Universal-Image-Loader 通用工具类的封装。

本文 示例中对普通加载效果、圆形加载效果、圆角加载效果进行了封装,圆环加载效果也很简单,在圆形加载效果基础上加两个构造参数 圆环颜色、圆环宽度(Integer strokeColor, float strokeWidth)读者有需求可自己实现。
代码很简单
如下:

package com.bailiangjin.imageload;import android.content.Context;import android.widget.ImageView;import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;import com.nostra13.universalimageloader.core.DisplayImageOptions;import com.nostra13.universalimageloader.core.ImageLoader;import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;import com.nostra13.universalimageloader.core.assist.QueueProcessingType;import com.nostra13.universalimageloader.core.display.BitmapDisplayer;import com.nostra13.universalimageloader.core.display.CircleBitmapDisplayer;import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;/** * 基于Universal imageLoader 封装的 图片加载工具类 * 枚举形式 实现单例 * Created by bailiangjin on 16/7/16. */public enum ImageLoadUtils {    INSTANCE;    /**     * 标准配置     */    private DisplayImageOptions normalOptions;    /**     * 圆形配置      */    private DisplayImageOptions circleOptions;    /**     * 圆角图片配置     */    private DisplayImageOptions roundedOptions;    private BitmapDisplayer simpleBitmapDisplayer;    private BitmapDisplayer circleBitmapDisplayer;    private BitmapDisplayer roundedBitmapDisplayer;    private int onLoadingImageResId;    private int onEmptyImageResId;    private int onFailedImageResId;    /**     * 构造方法 参数初始化 单例形式 只会初始化一次 避免不必要的资源开支     */    private ImageLoadUtils() {        //初始化 全局默认图片        onLoadingImageResId = R.drawable.icon_user;        onEmptyImageResId = R.drawable.icon_user;        onFailedImageResId = R.drawable.icon_user;        simpleBitmapDisplayer = new SimpleBitmapDisplayer();        normalOptions = getOption(onLoadingImageResId, onEmptyImageResId, onFailedImageResId, simpleBitmapDisplayer);        circleBitmapDisplayer = new CircleBitmapDisplayer();        circleOptions = getOption(onLoadingImageResId, onEmptyImageResId, onFailedImageResId, circleBitmapDisplayer);        //圆角图片 圆角半径dp        int cornerRadiusDp = 10;        //圆角大小通过 dp2px转换 使得 不同分辨率设备上呈现一致显示效果        roundedBitmapDisplayer = new RoundedBitmapDisplayer(dip2px(MyApplication.getContext(),cornerRadiusDp));        roundedOptions = getOption(onLoadingImageResId, onEmptyImageResId, onFailedImageResId, roundedBitmapDisplayer);    }    /**     * 重构 抽取出的通用生成Option方法     * @param onLoadingImageResId     * @param onEmptyImageResId     * @param onFailedImageResId     * @param bitmapDisplayer normal 或圆形、圆角 bitmapDisplayer     *                           * @return     */    private DisplayImageOptions getOption(int onLoadingImageResId, int onEmptyImageResId, int onFailedImageResId, BitmapDisplayer bitmapDisplayer) {        return new DisplayImageOptions.Builder()                .showImageOnLoading(onLoadingImageResId)                .showImageForEmptyUri(onEmptyImageResId)                .showImageOnFail(onFailedImageResId)                .cacheInMemory(true)                .cacheOnDisk(true)                .considerExifParams(true)                .displayer(bitmapDisplayer)                .build();    }    public void loadImageView(ImageView iv, String url) {        ImageLoader.getInstance().displayImage(url, iv, normalOptions);    }    public void loadCircleImageView(ImageView iv, String url) {        ImageLoader.getInstance().displayImage(url, iv, circleOptions);    }    public void loadRoundedImageView(ImageView iv, String url) {        ImageLoader.getInstance().displayImage(url, iv, roundedOptions);    }    /**     * dip px 转换工具类 将圆角进行转换 以实现不同分辨率设备上呈现相同效果     * @param context     * @param dpValue     * @return     */    public static int dip2px(Context context, float dpValue) {        final float density = context.getResources().getDisplayMetrics().density;        return (int) (dpValue * density + 0.5f);    }    /**     * 初始化方法     * @param context     */    public void init(Context context) {        // This configuration tuning is custom. You can tune every option, you may tune some of them,        // or you can create default configuration by        //  ImageLoaderConfiguration.createDefault(this);        // method.        ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context);        config.threadPriority(Thread.NORM_PRIORITY - 2);        config.denyCacheImageMultipleSizesInMemory();        config.diskCacheFileNameGenerator(new Md5FileNameGenerator());        config.diskCacheSize(80 * 1024 * 1024); // 80 MiB        config.tasksProcessingOrder(QueueProcessingType.LIFO);        config.writeDebugLogs(); // Remove for release app        // Initialize ImageLoader with configuration.        ImageLoader.getInstance().init(config.build());    }}

使用:

1、初始化

package com.bailiangjin.imageload;import android.app.Application;import android.content.Context;/** * Created by bailiangjin on 16/7/16. */public class MyApplication extends Application{   private static Context context;    @Override    public void onCreate() {        super.onCreate();        context=getApplicationContext();        //初始化 ImageLoad工具类         // 只在Application中初始化一次 全局可使用        ImageLoadUtils.INSTANCE.init(this);    }    public static Context getContext() {        return context;    }}

2、代码中调用:

package com.bailiangjin.imageload;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.ImageView;/** * @author bailiangjin  */public class MainActivity extends AppCompatActivity {    ImageView iv_org;    ImageView iv_round;    ImageView iv_rounded_rectangle;    static String picUrl="https://raw.githubusercontent.com/bailiangjin/bailiangjin.github.io/master/dev/download/picture/HeadPortrait.jpeg";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        iv_org = (ImageView) findViewById(R.id.iv_org);        iv_round = (ImageView) findViewById(R.id.iv_round);        iv_rounded_rectangle = (ImageView) findViewById(R.id.iv_rounded_rectangle);        //普通加载效果        ImageLoadUtils.INSTANCE.loadImageView(iv_org,picUrl);        //圆形图片加载效果        ImageLoadUtils.INSTANCE.loadCircleImageView(iv_round,picUrl);        //圆角加载效果        ImageLoadUtils.INSTANCE.loadRoundedImageView(iv_rounded_rectangle,picUrl);    }}

效果:

点击查看本Demo Github源码

更多相关文章

  1. 开发安卓-android使用webview加载网页无法使用js的问题
  2. Android:不同drawable文件夹的区别
  3. android 之 新浪微博
  4. android 简单比较 两个图片是否一致
  5. Android(安卓)bluetooth start discovery analyse
  6. Android(安卓)7.1 导航栏增加按键
  7. android 调用系统照相机拍照后保存到系统相册,在系统图库中能看到
  8. android studio 2.0 引导页示例
  9. [掌眼]Android(安卓)WebView Long Press长按保存图片到手机

随机推荐

  1. Android中Intent与Bundle 在传值时有什么
  2. Android之用户定位(三)
  3. Android第三方登录-----微信登录接入方法
  4. 【Android】各个透明度的取值
  5. 5.4呈献:HP-Socket v5.3.1 支持 Android(
  6. Android编译环境的配置
  7. Kotlin Android Studio入门学习研究
  8. 修改Android开机图片、动画、声音
  9. Android Studio-Gradle项目中添加libs目
  10. Android SlidingMenu例子运行报错的解决