安卓图片加载之使用universalimageloader加载圆形圆角图片
来源:互联网 发布:如何做软件代理商 编辑:程序博客网 时间:2024/06/05 20:51
前言
话说这universalimageloader加载图片对搞过2年安卓程序都是用烂了再熟悉不过了,就是安卓新手也是百度就会有一大堆东西出来,今天为什么这里还要讲使用universalimageloader呢。一是因为这个东西确实是一个很不错的东西,第二让我们用imageloader来学习 加载圆形圆角图片。三呢以后项目中可能用到了直接copy。
GITHUB上的下载路径为:https://github.com/nostra13/Android-Universal-Image-Loader ,下载最新的库文件,并且导入到项目的LIB下便可以使用。该库以及DEMO本地下载链接:下载地址
效果图:
universalimageloader的简单介绍:
看了再也不担心会oom,然后也不需要去考率3级缓存,我们可以看出,UIL加载图片的一般流程是先判断内存中是否有对应的Bitmap,再判断磁盘(disk)中是否有,如果没有就从网络中加载。最后根据原先在UIL中的配置判断是否需要缓存Bitmap到内存或磁盘中。Bitmap加载完后,就对它进行解析,然后显示到特定的ImageView中。
universalimageloader的使用
第一步:加入库
1 .下载jar包放在libs文件夹中2 .Maven dependency:
<dependency> <groupId>com.nostra13.universalimageloader</groupId> <artifactId>universal-image-loader</artifactId> <version>1.9.2</version></dependency>
3 .Gradle dependency:
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.2'
第二步:配置清单文件权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.INTERNET" />
第三步:配置ImageLoaderConfiguration参数
在应用中配置ImageLoaderConfiguration参数(只能配置一次,如多次配置,则默认第一次的配置参数)
File cacheDir = StorageUtils.getCacheDirectory(context); //缓存文件夹路径ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) .memoryCacheExtraOptions(480, 800) // default = device screen dimensions 内存缓存文件的最大长宽 .diskCacheExtraOptions(480, 800, null) // 本地缓存的详细信息(缓存的最大长宽),最好不要设置这个 .taskExecutor(...) .taskExecutorForCachedImages(...) .threadPoolSize(3) // default 线程池内加载的数量 .threadPriority(Thread.NORM_PRIORITY - 2) // default 设置当前线程的优先级 .tasksProcessingOrder(QueueProcessingType.FIFO) // default .denyCacheImageMultipleSizesInMemory() .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通过自己的内存缓存实现 .memoryCacheSize(2 * 1024 * 1024) // 内存缓存的最大值 .memoryCacheSizePercentage(13) // default .diskCache(new UnlimitedDiscCache(cacheDir)) // default 可以自定义缓存路径 .diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值 .diskCacheFileCount(100) // 可以缓存的文件数量 // default为使用HASHCODE对UIL进行加密命名, 还可以用MD5(new Md5FileNameGenerator())加密 .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) .imageDownloader(new BaseImageDownloader(context)) // default .imageDecoder(new BaseImageDecoder()) // default .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default .discCache(new LimitedAgeDiscCache(cacheDir, 7 * 24 * 60 * 60))// 自定义缓存路径,7天后自动清除缓存 .writeDebugLogs() // 打印debug log .build(); //开始构建
Configuration的参数就算是配好了,当然了怎么配置随你的便,但是必须在初始化以前必须要配置,为了不进行多次配置,我们都把它放在application里面的。
第四步:初始化imageLoder
ImageLoader.getInstance().init(config); // 初始化
第五步 :imageLoder显示option的配置
options = new DisplayImageOptions.Builder() .showStubImage(R.drawable.ic_stub)//缓冲过程中图片 .showImageForEmptyUri(R.mipmap.ic_launcher)// 设置图片Uri为空或是错误的时候显示的图片 .showImageOnFail(R.drawable.ic_error)// 设置图片加载或解码过程中发生错误显示的图片 .cacheInMemory(true)//缓存道内存 .cacheOnDisc(true)//缓存到硬盘 .bitmapConfig(Bitmap.Config.ARGB_8888) //设置图片的解码类型 .build();
上段代码我们设置了加载显示过程中的图片处理,和缓存处理。
然后使用ImageLoader.getInstance().displayImage(url,imagview,options);
我们通过设置 .displayer属性来产生各种图片形状。
然后加载本地图片资源的代码:
import android.widget.ImageView;import com.nostra13.universalimageloader.core.ImageLoader;/** * 异步加载本地图片工具类 * * */public class LoadLocalImageUtil { private LoadLocalImageUtil() { } private static LoadLocalImageUtil instance = null; public static synchronized LoadLocalImageUtil getInstance() { if (instance == null) { instance = new LoadLocalImageUtil(); } return instance; } /** * 从内存卡中异步加载本地图片 * * @param uri * @param imageView */ public void displayFromSDCard(String uri, ImageView imageView) { // String imageUri = "file:///mnt/sdcard/image.png"; // from SD card ImageLoader.getInstance().displayImage("file://" + uri, imageView); } /** * 从assets文件夹中异步加载图片 * * @param imageName * 图片名称,带后缀的,例如:1.png * @param imageView */ public void dispalyFromAssets(String imageName, ImageView imageView) { // String imageUri = "assets://image.png"; // from assets ImageLoader.getInstance().displayImage("assets://" + imageName, imageView); } /** * 从drawable中异步加载本地图片 * * @param imageId * @param imageView */ public void displayFromDrawable(int imageId, ImageView imageView) { // String imageUri = "drawable://" + R.drawable.image; // from drawables // (only images, non-9patch) ImageLoader.getInstance().displayImage("drawable://" + imageId, imageView); } /** * 从内容提提供者中抓取图片 */ public void displayFromContent(String uri, ImageView imageView) { // String imageUri = "content://media/external/audio/albumart/13"; // // from content provider ImageLoader.getInstance().displayImage("content://" + uri, imageView); }}
universalimageloader加载圆形图片
所以呢我们这里来了一个自定义圆形显示控件:
import android.graphics.Bitmap;import android.graphics.BitmapShader;import android.graphics.Canvas;import android.graphics.ColorFilter;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.PixelFormat;import android.graphics.Rect;import android.graphics.RectF;import android.graphics.Shader;import android.graphics.drawable.Drawable;import com.nostra13.universalimageloader.core.assist.LoadedFrom;import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;import com.nostra13.universalimageloader.core.imageaware.ImageAware;/** * Created by zengyu on 2016/3/2. */public class Displayer extends RoundedBitmapDisplayer { public Displayer(int cornerRadiusPixels) { super(cornerRadiusPixels); } // 显示位图 @Override public void display(Bitmap bitmap, ImageAware imageAware, LoadedFrom loadedFrom) { imageAware.setImageDrawable(new CircleDrawable(bitmap, margin)); } public static class CircleDrawable extends Drawable { private final int margin; private final RectF mRect = new RectF(); private final BitmapShader bitmapShader; private final Paint paint; private RectF mBitmapRect; public CircleDrawable(Bitmap bitmap, int margin) { this.margin = 0; // 创建着色器 bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); mBitmapRect = new RectF(margin, margin, bitmap.getWidth() - margin, bitmap.getHeight() - margin); // 设置画笔 paint = new Paint(); paint.setAntiAlias(true); paint.setShader(bitmapShader); } // 画圆,覆盖原来的位图 @Override protected void onBoundsChange(Rect bounds) { super.onBoundsChange(bounds); mRect.set(margin, margin, bounds.width() - margin, bounds.height() - margin); // 调整位图,设置该矩阵,转换映射源矩形和目的矩形 Matrix shaderMatrix = new Matrix(); shaderMatrix.setRectToRect(mBitmapRect, mRect, Matrix.ScaleToFit.FILL); // 设置着色器矩阵 bitmapShader.setLocalMatrix(shaderMatrix); } // 画出其边界(通过设置的setBounds) @Override public void draw(Canvas canvas) { canvas.drawRoundRect(mRect, mRect.width()/2 , mRect.height()/2, paint); } /** * 返回此绘制对象的不透明度/透明度 ,返回的值是抽象的格式常数的PixelFormat之一:未知,半透明,透明或不透明 * */ @Override public int getOpacity() { // 半透明 return PixelFormat.TRANSLUCENT; } // 设置透明度 @Override public void setAlpha(int alpha) { paint.setAlpha(alpha); } // 彩色滤光片(通过设置setColorFilter) @Override public void setColorFilter(ColorFilter cf) { paint.setColorFilter(cf); } }}
好了基本的使用都讲完了。
import android.graphics.Bitmap;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.widget.ImageView;import com.nostra13.universalimageloader.core.DisplayImageOptions;import com.nostra13.universalimageloader.core.ImageLoader;import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;import butterknife.ButterKnife;import butterknife.InjectView;public class MainActivity extends AppCompatActivity { @InjectView(R.id.iv_normal) ImageView ivNormal; @InjectView(R.id.iv_fillet) ImageView ivFillet; @InjectView(R.id.iv_circular) ImageView ivCircular; private DisplayImageOptions options1,options2,options3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.inject(this); //原图显示 options1 = new DisplayImageOptions.Builder() .showStubImage(R.drawable.ic_stub) .showImageForEmptyUri(R.mipmap.ic_launcher) .showImageOnFail(R.drawable.ic_error) .cacheInMemory(true) .cacheOnDisc(true) .bitmapConfig(Bitmap.Config.ARGB_8888) //设置图片的解码类型 .build(); //圆角图片 options2 = new DisplayImageOptions.Builder() .showStubImage(R.drawable.ic_stub) .showImageForEmptyUri(R.mipmap.ic_launcher) .showImageOnFail(R.drawable.ic_error) .cacheInMemory(true) .cacheOnDisc(true) .bitmapConfig(Bitmap.Config.ARGB_8888) //设置图片的解码类型 .displayer(new RoundedBitmapDisplayer(20)) .build(); //圆形图片 options3 = new DisplayImageOptions.Builder() .showStubImage(R.drawable.ic_stub) .showImageForEmptyUri(R.mipmap.ic_launcher) .showImageOnFail(R.drawable.ic_error) .cacheInMemory(true) .cacheOnDisc(true) .bitmapConfig(Bitmap.Config.ARGB_8888) //设置图片的解码类型 .displayer(new Displayer(0)) .build(); ImageLoader.getInstance().displayImage("http://img.my.csdn.net/uploads/201309/01/1378037193_1286.jpg",ivNormal,options1); ImageLoader.getInstance().displayImage("http://img.my.csdn.net/uploads/201309/01/1378037193_1286.jpg",ivFillet,options2); ImageLoader.getInstance().displayImage("http://img.my.csdn.net/uploads/201309/01/1378037193_1286.jpg",ivCircular,options3); }}
四、注意事项
1、ImageLoader是根据ImageView的height,width确定图片的宽高
2、一定要对ImageLoaderConfiguration进行初始化,否则会报错
3、开启缓存后默认会缓存到外置SD卡
4、清除缓存
public void onClearMemoryClick(View view) { ImageLoader.getInstance().clearMemoryCache(); // 清除内存缓存 } public void onClearDiskClick(View view) { ImageLoader.getInstance().clearDiskCache(); // 清除本地缓存 }
最近技术群里面发现面试的题目越来越有深度了,然后感觉工作也是越来越难找咯,是该继续学习新东西了。
到了
com.nostra13.universalimageloader:universal-image-loader:1.9.3
里面就有CircleBitmapDisplayer()了,再也不需要自己去写了,当然你也可以使用universal-image-loader-1.9.5.jar直接网络加载圆形图片,谢谢大家的指证。
- 安卓图片加载之使用universalimageloader加载圆形圆角图片
- 安卓图片加载之使用universalimageloader加载圆形圆角图片
- 安卓图片加载之使用universalimageloader加载圆形圆角图片
- UniversalImageLoader图片加载
- Glide使用 加载网络图片 圆形图片 圆角图片
- 图片加载框架---UniversalImageLoader使用(一)
- 图片加载框架---UniversalImageLoader使用(一)
- 图片加载框架---UniversalImageLoader使用(一)
- 图片加载框架---UniversalImageLoader使用(一)
- 关于安卓glide图片框架加载的图片转换成圆形圆角的思路
- 使用Glide动态加载圆形图片和圆角图片
- 使用Glide动态加载圆形图片和圆角图片
- 使用Glide动态加载圆形图片跟圆角图片
- Universalimageloader图片加载框架缓存本地图片的使用
- 开源项目之UniversalImageLoader(异步加载大量图片)
- 开源项目之UniversalImageLoader(异步加载大量图片)
- 开源项目之UniversalImageLoader(异步加载大量图片)
- Glide 加载圆角、圆形图片
- 【面试】iOS 开发面试题(二)
- 布局技巧
- Unity中加入Android项目的Build步骤 .<unity引用Android的jar包><Android对unity做二次开发>
- Java中堆(heap)和栈(stack)区别
- 嵌入式Linux驱动学习之USART串口控制:基于AT91SAM9261EK
- 安卓图片加载之使用universalimageloader加载圆形圆角图片
- 数据仓库-核心系统
- Jetty实战之 嵌入式Jetty运行web app
- ACM杭电的AC回顾——2029
- Memcache Telnet基本操作命令
- eclipse中创建android模拟器时提示“no target selected ”
- 产品经理必备软件——Axure使用详解(3)
- 从AOP框架学习iOS Runtime
- 隐藏div的几种常见方法