一、Universal-image-loader:它是一个强大的图片加载库,包含各种各样的配置,最老牌,使用也最广泛。具体的特性如下:
具体的用法:先添加依赖:
compile'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
在application里面创建ImageLoader的配置参数,并初始化到ImageLoade:
/** * 初始化Universal-Image-Loader */
private void initImageLoader()
{
// 获取单例的ImageLoader对象
imageLoader = ImageLoader.getInstance();
// 定义内存缓存大小
int cacheSize = (int) Runtime.getRuntime().maxMemory() / 8;
// 定义ImageLoaderConfiguration
ImageLoaderConfiguration configuration =
new ImageLoaderConfiguration.Builder(this)
.threadPoolSize(3)//设置线程池个数
.threadPriority(Thread.NORM_PRIORITY - 2)
.diskCache(new LimitedAgeDiskCache(new File("/mnt/sdcard/imagecache"), 60 * 60 * 1000))//设置磁盘缓存缓存,LimitedAgeDiskCache限制了缓存对象最长存活周期的磁盘缓存, 内部管理一个HashMap<File, Long>, save()时存储当前时间作为对象的创建时间,get()时判断如果当前缓存对象存活时间已经超过设置的最长时间,则删除。
.diskCacheSize(50 * 1024 * 1024)//设置磁盘缓存大小
.diskCacheFileCount(1000)//设置磁盘缓存文件个数
.memoryCache(new LimitedAgeMemoryCache(new LruMemoryCache(cacheSize), 60 * 60 * 1000))//设置内存缓存
.build();
// 初始化配置
ImageLoader.getInstance().init(configuration);
options = new DisplayImageOptions.Builder()
.delayBeforeLoading(1000)//设置延时多少时间后开始下载
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)// 是否考虑JPEG图像EXIF参数(旋转,翻转)
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)//设置图片以何种编码方式显示
.bitmapConfig(Bitmap.Config.RGB_565) // 设置图片的解码类型
.displayer(new RoundedBitmapDisplayer(20))//是否设置为圆角,弧度为多少
.displayer(new FadeInBitmapDisplayer(1000))//是否图片加载好后渐入的动画时间
.showImageOnLoading(R.mipmap.ic_launcher)//设置正在加载时的图片
.showImageOnFail(R.mipmap.ic_launcher)//设置加载失败时的图片
.showImageForEmptyUri(R.mipmap.ic_launcher)//设置图片Uri为空或是错误的时候显示的图片
.resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位
.build();
}
/** * 获取ImageLoader对象 * * @return */
public ImageLoader getImageLoader()
{
return this.imageLoader;
}
public DisplayImageOptions getImageOptions()
{
return options;
}
/** * 获取应用程序对象 * * @return */
public static BaseApplication getApplication()
{
return application;
}
在我们使用的时候,可以按如下方式:
private DisplayImageOptions options = options = BaseApplication.getApplication().getImageOptions();//获取在application里面的DisplayImageOptions
BaseApplication.getApplication().getImageLoader().displayImage(url,imageView,options);//获取ImageLoader并将图片设置进imageView里面
当然对于不同的场景可以设置不同的DisplayImageOptions ,也可以在使用的时候配置不同的options 。
补充对于上面的配置:
1).imageScaleType(ImageScaleType imageScaleType) 是设置 图片的缩放方式
缩放类型mageScaleType:
EXACTLY :图像将完全按比例缩小的目标大小
EXACTLY_STRETCHED:图片会缩放到目标大小完全
IN_SAMPLE_INT:图像将被二次采样的整数倍
IN_SAMPLE_POWER_OF_2:图片将降低2倍,直到下一减少步骤,使图像更小的目标大小
NONE:图片不会调整
2).displayer(BitmapDisplayer displayer) 是设置 图片的显示方式
显示方式displayer:
RoundedBitmapDisplayer(int roundPixels)设置圆角图片
FakeBitmapDisplayer()这个类什么都没做
FadeInBitmapDisplayer(int durationMillis)设置图片渐显的时间
SimpleBitmapDisplayer()正常显示一张图片
对于ListView,GridView中,滑动过程中暂停加载图片设置:
listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
gridView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
二、Picasso:Square开发的,和OkHttp搭配起来更配。
Picasso的特性:
- 在adapter中回收和取消当前的下载;
- 使用最少的内存完成复杂的图形转换操作;
- 自动的内存和硬盘缓存;
- 图形转换操作,如变换大小,旋转等,提供了接口来让用户可以自定义转换操作;
- 加载载网络或本地资源;
Picasso不仅实现了图片异步加载的功能,还解决了android中加载图片时需要解决的一些常见问题:
1.在adapter中需要取消已经不在视野范围的ImageView图片资源的加载,否则会导致图片错位,Picasso已经解决了这个问题。
2.使用复杂的图片压缩转换来尽可能的减少内存消耗。
3.自带内存和硬盘二级缓存功能。
Picasso的用法比较简单:一行代码就可以解决 :
Picasso.with(context).load(url).into(imageView);
在网上看到说Picasso可以自动检测适配器复用
@Override
public void getView(int position, View convertView, ViewGroup parent) {
SquaredImageView view = (SquaredImageView) convertView;
if (view == null) {
view = new SquaredImageView(context);
}
String url = getItem(position);
Picasso.with(context).load(url).into(view);
}
我对这个SquaredImageView 不是很理解也不是很明白这个是什么意思,希望知道的朋友可以为我解答。
Picasso在图片加载的时候对图片进行一些处理:
Picasso.with(context)
.load(url)
.resize(200, 200) //重置图片的大小,设置图片显示的像素。
.config(Bitmap.Config.RGB_565)//设置Bitmap的Config属性
.centerCrop() //设置ImageView的ScaleType属性
.placeholder(R.mipmap.ic_launcher) //设置加载等待图片
.error(R.mipmap.ic_launcher) //设置加载错误图片
.into(imageView);
还有以下操作:
noPlaceholder():设置没有加载等待图片
tag(Object tag):设置标记
fit():自适应,下载的图片有多少像素就显示多少像素
resizeDimen(int targetWidthResId, int targetHeightResId):设置图片显示的像素。
centerInside():设置ImageView的ScaleType属性.
rotate(float degrees):设置旋转角度。
rotate(float degrees, float pivotX, float pivotY):设置以某个中心点设置某个旋转角度。
priority(Priority priority):设置请求的优先级。
transform(Transformation transformation):
skipMemoryCache():跳过内存缓存
memoryPolicy(MemoryPolicy policy, MemoryPolicy… additional):放弃memory cache(使用:.memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)memoryPolicy的NO_CACHE是指图片加载时放弃在内存缓存中查找,NO_STORE是指图片加载完不缓存在内存中。
networkPolicy(NetworkPolicy policy, NetworkPolicy… additional):加载网络图片,并设置不使用内存缓存中查找也不存储内存缓存
noFade():没有淡入淡出效果
get():获得bitmap对象
三、Glide:Google推荐的图片加载库,专注于流畅的滚动。特点:
(1)使用简单
(2)可配置度高,自适应程度高
(3)支持常见图片格式 Jpg png gif webp
(4)支持多种数据源 网络、本地、资源、Assets 等
(5)高效缓存策略 支持Memory和Disk图片缓存 默认Bitmap格式采用RGB_565内存使用至少减少一半
(6)生命周期集成 根据Activity/Fragment生命周期自动管理请求
(7)高效处理Bitmap 使用Bitmap Pool使Bitmap复用,主动调用recycle回收需要回收的Bitmap,减小系统回收压力
用法:添加依赖:
compile 'com.github.bumptech.glide:glide:3.7.0
Glide的使用还要依赖support-v4,因此没有添加v4包的要添加v4依赖:
compile 'com.android.support:support-v4:23.3.0'
详细用法:
Glide.with(this)
.load(url)
.asGif()//表示的gif动画
.override(300,300)//设置显示图片的width,height
.diskCacheStrategy(DiskCacheStrategy.SOURCE)//磁盘缓存策略
.placeholder(R.drawable.progressbar)//设置图片加载时的占位图
.thumbnail(1f)//设置缩略图显示传入值(0-1f)
.error(R.drawable.error)//设置加载错误的图片
.priority(Priority.HIGH)//当前线程的优先级
.into(mImageView);
还有一些操作:
.asBitmap():无论资源是不是gif动画,都作为Bitmap对待。如果是gif动画会停在第一帧。
.crossFade():显示图片时执行淡入淡出的动画
.dontAnimate():不执行显示图片时的动画
.animate():设置显示的动画
.transform(): 图片圆角或圆形显示(继承 BitmapTransformation可行)
.listener():异常监听
.bitmapTransform():bitmap转换, 比如:旋转,方法,缩小,高斯模糊等等(当用了转换后你就不能使用 .centerCrop() 或 .fitCenter() 了。)
下面推荐一篇文章,里面有Glide使用中存在的一些问题和解决方案。http://www.wtoutiao.com/p/y3eaF0.html
四、Fresco:是 Facebook 出品,特点:
1)内存管理
在5.0以下系统,Fresco将图片放到一个特别的内存区域。当然,在图片不显示的时候,占用的内存会自动被释放。这会使得APP更加流畅,减少因图片内存占用而引发的OOM。
内存分配采用:系统匿名共享内存
2)渐进式呈现图片
渐进式图片格式先呈现大致的图片轮廓,然后随着图片下载的继续, 呈现逐渐清晰的图片,这对于移动设备,尤其是慢网络有极大的利好,可带来更好的用户体验。
3)支持加载Gif图,支持WebP格式。
4)图像的呈现
(1)自定义居中焦点(对人脸等图片显示非常有帮助)。
(2)圆角图,当然圆圈也行。
(3)下载失败之后,点击重新下载。
(4)自定义占位图,自定义overlay, 或者进度条。
(5)指定用户按压时的overlay。
5)图像的加载
(1)为同一个图片指定不同的远程路径,或者使用已经存在本地缓存中的图片。
(2)先显示一个低解析度的图片,等高清图下载完之后再显示高清图。
(3)加载完成回调通知。
(4)对于本地图,如有EXIF缩略图,在大图加载完成之前,可先显示缩略图。
(5)缩放或者旋转图片。
(6)处理已下载的图片。
使用:先添加依赖
compile 'com.facebook.fresco:fresco:0.14.1'
在xml文件里面:记得添加fresco的自定义属性
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/sdv"
android:layout_width="300dp"
android:layout_height="300dp"
android:layout_gravity="center"
android:layout_marginTop="20dp"
fresco:actualImageScaleType="focusCrop"
fresco:fadeDuration="300"
fresco:failureImage="@mipmap/ic_launcher"
fresco:failureImageScaleType="centerInside"
fresco:placeholderImage="@mipmap/ic_launcher"
fresco:placeholderImageScaleType="fitCenter"
fresco:roundAsCircle="true" />
</LinearLayout>
在Activity里面:
public class ThreeActivity extends AppCompatActivity {
private SimpleDraweeView mSimpleDraweeView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//初始化在需要在setContentView之前或者在application的onCreate()里面
Fresco.initialize(this);
setContentView(R.layout.acticity_three);
mSimpleDraweeView = (SimpleDraweeView) findViewById(R.id.sdv);
Uri uri = Uri.parse("http://dynamic-image.yesky.com/740x-/uploadImages/2015/163/50/690V3VHW0P77.jpg");
// mSimpleDraweeView.setImageURI(uri);
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setUri(uri)
.setAutoPlayAnimations(true)
.build();
mSimpleDraweeView.setController(controller);
}
}
Fresco采用的SimpleDraweeView.setImageURI()和SimpleDraweeView.setController()两种方式加载图片。并且Frescoo 不支持相对路径的URI. 所有的URI都必须是绝对路径。
下面还有一些Fresco的属性:
fresco:fadeDuration="300" // 淡入淡出的持续时间
fresco:actualImageScaleType="focusCrop" // 实际图像的缩放类型
fresco:placeholderImage="@color/wait_color" //占位图
fresco:placeholderImageScaleType="fitCenter" //占位图的缩放类型
fresco:failureImage="@drawable/error" //下载失败显示的图片
fresco:failureImageScaleType="centerInside" //失败图的缩放类型
fresco:retryImage="@drawable/retrying"
//图片加载失败时显示,提示用户点击重新加载,重复加载4次还是没有加载出来的时候才会显示failureImage的图片
fresco:retryImageScaleType="centerCrop" //重新加载的图片缩放类型
fresco:progressBarImage="@drawable/progress_bar" //进度条图片
fresco:progressBarImageScaleType="centerInside"//精度条图片缩放类型
fresco:progressBarAutoRotateInterval="1000"//进度图自动旋转间隔时间(单位:毫秒ms)
fresco:backgroundImage="@color/blue"//背景图片,这里的背景图片首先被绘制
fresco:overlayImage="@drawable/watermark"// 设置叠加图,在xml中只能设置一张叠加图片,如果需要多张图片的话,需要在java代码中设置哦
fresco:pressedStateOverlayImage="@color/red"// 设置点击状态下的叠加图
fresco:roundAsCircle="false" //设置为圆形图
fresco:roundedCornerRadius="1dp" // 圆角半径
fresco:roundTopLeft="true" // 左上角是否为圆角
fresco:roundTopRight="false"
fresco:roundBottomLeft="false"
fresco:roundBottomRight="true"
fresco:roundWithOverlayColor="@color/corner_color"//圆角覆盖物颜色
fresco:roundingBorderWidth="2dp" //边框的宽度
fresco:roundingBorderColor="@color/border_color" //边框颜色
说明:必须声明 android:layout_width 和 android:layout_height,否则将无法正确加载图像,另外不支持 wrap_content 属性。
对于Fresco的使用我参考了一下这篇文章http://www.cnblogs.com/liushilin/p/5659301.html。
上述的这些都是简单的使用,更加深层次的还需要大家深入研究。