前言:
前一篇
Android实战(橘子娱乐)-首页(第四篇 MainRecyclerViewAdapter数据与布局的绑定)中我们学习了如何将数据和布局适配起来,但是由于要显示很多图片,所以我们用到了一个图片加载框架Glide的封装工具类
ImageLoaderUtils
去实现图片加载。下面我们将具体来看一下这个工具类具体是怎么实现的。
我们直接上代码:
package com.andy.orange.utils;
/**
* Created by Andy Lau on 2017/8/14.
* Description : 图片加载工具类 使用glide框架封装
*/
import android.content.Context;
import android.widget.ImageView;
import com.andy.orange.R;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DecodeFormat;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import java.io.File;
public class ImageLoaderUtils {
/*
* thumbnail(0.5f)//设置播放比例
* diskCacheStrategy(DiskCacheStrategy strategy)设置缓存策略 DiskCacheStrategy.SOURCE|DiskCacheStrategy.RESULT|DiskCacheStrategy.ALL|DiskCacheStrategy.NONE
* priority(Priority priority)//设置优先级
* dontAnimate()//移除所有动画
* animate()//一步加载完成后执行的动画
* placeholder()//设置占位图片
* error()加载错误时显示的图片
* allback(int resourceId)//设置model为空显示的图片,未设置显示error图片
* skipMemoryCache(boolean skip)//设置是否跳过内存缓存,不保证一定不被缓存
* into()设置将被加载的目标资源
* asBitmap()//无论是gif还是普通图片都当做bitmap对待,动图将显示第一帧
* asGif()//把资源当做gifDrawable对待,如果不是则显示error设置的图片
* crossFade()//设置加载动画
* transform()//图片转换
* */
public static void display(Context context, ImageView imageView, String url, int placeholder, int error) {
if (imageView == null) {
throw new IllegalArgumentException("argument error");
}
Glide.with(context).load(url).placeholder(placeholder)
.error(error).crossFade().into(imageView);
}
public static void display(Context context, ImageView imageView, String url) {
if (imageView == null) {
throw new IllegalArgumentException("argument error");
}
Glide.with(context).load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.centerCrop()
.placeholder(R.drawable.ic_image_loading)
.error(R.drawable.ic_image_loading)
.crossFade().into(imageView);
}
public static void display(Context context, ImageView imageView, File url) {
if (imageView == null) {
throw new IllegalArgumentException("argument error");
}
Glide.with(context).load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.centerCrop()
.placeholder(R.drawable.ic_image_loading)
.error(R.drawable.ic_image_loading)
.crossFade().into(imageView);
}
public static void displaySmallPhoto(Context context, ImageView imageView, String url) {
if (imageView == null) {
throw new IllegalArgumentException("argument error");
}
Glide.with(context).load(url).asBitmap()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.placeholder(R.drawable.ic_image_loading)
.error(R.drawable.ic_image_loading)
.thumbnail(0.5f)
.into(imageView);
}
public static void displayBigPhoto(Context context, ImageView imageView, String url) {
if (imageView == null) {
throw new IllegalArgumentException("argument error");
}
Glide.with(context).load(url).asBitmap()
.format(DecodeFormat.PREFER_ARGB_8888)
.fitCenter()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.placeholder(R.drawable.ic_image_loading)
.error(R.drawable.ic_image_loading)
.into(imageView);
}
public static void display(Context context, ImageView imageView, int url) {
if (imageView == null) {
throw new IllegalArgumentException("argument error");
}
Glide.with(context).load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.centerCrop()
.placeholder(R.drawable.ic_image_loading)
.error(R.mipmap.head_image)
.crossFade()
.into(imageView);
}
public static void displayRound(Context context, ImageView imageView, String url) {
if (imageView == null) {
throw new IllegalArgumentException("argument error");
}
Glide.with(context).load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.error(R.mipmap.head_image)
.centerCrop()
.transform(new GlideRoundTransformUtil(context)).into(imageView);
}
}
简单说这个工具类就是通过Glide实现缓存加载并显示图片资源的不同类型,比如缩略图、大图、圆心图和原图。同时配置一些辅助的属性,比如加载时显示的图片,加载失败时显示的图片等。glide的简单配置代码注释很清楚,当然不是很深入,需要学习更多的可以去网上看看Glide的文章,这里我们提一下展示圆形图片的操作,看上面代码我们会看到如下这样的设置:
.transform(new GlideRoundTransformUtil(context)).into(imageView)
对,你没猜错,这就是原图转换成圆形图的关键配置,接下来我们看一下
GlideRoundTransformUtil
的具体实现代码:
package com.andy.orange.utils;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
/**
* Created by Andy Lau on 2017/8/14.
* description:glide转换圆形图片
*/
public class GlideRoundTransformUtil extends BitmapTransformation {
public GlideRoundTransformUtil(Context context) {
super(context);
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
return circleCrop(pool, toTransform);
}
private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
if (source == null) return null;
//去最小的边
int size = Math.min(source.getWidth(), source.getHeight());
//设置中心点
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
// 创建最小边的正方形
Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
if (result == null) {
result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
}
//创建画布
Canvas canvas = new Canvas(result);
//设置画笔
Paint paint = new Paint();
//CLAMP : 如果渲染器超出原始边界范围,会复制范围内边缘染色
//REPEAT :横向和纵向的重复渲染器图片,平铺。
//MIRROR :横向和纵向的重复渲染器图片,这个和REPEAT 重复方式不一样,他是以镜像方式平铺
paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
paint.setAntiAlias(true);
float r = size / 2f;
canvas.drawCircle(r, r, r, paint);
return result;
}
@Override
public String getId() {
return getClass().getName();
}
}
分析:从代码来看就是继承了
BitmapTransformation
类
实现了他的
transform(BitmapPool pool,Bitmap toTransform,int outWidth,int outHeight)
方法,在里面实现对原图的裁切。根据原图长宽的最短边会准裁切出一个正方形,然后再根据这个正方形绘制圆并返回。
这一篇文章就到这里,下一篇我们来学习一下presenter是如何连接Model层和View层并实现数据的传递的。