Android实战(橘子娱乐)-首页(第五篇 Glide加载图片的简单封装)
来源:互联网 发布:mysql月租 编辑:程序博客网 时间:2024/05/03 00:04
前言:
前一篇 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层并实现数据的传递的。
阅读全文
0 0
- Android实战(橘子娱乐)-首页(第五篇 Glide加载图片的简单封装)
- Android实战(橘子娱乐)-首页(第四篇 MainRecyclerViewAdapter数据与布局的绑定)
- Android实战(橘子娱乐)-首页(第二篇 首页布局与Activity代码)
- Android实战(橘子娱乐)-首页(第三篇 IRecyclerView自定义刷新头ClassicRefreshHeaderView和SharedPreferencesUtils)
- Android实战(橘子娱乐)-首页(第六篇 Presenter如何将Model层数据传递给View层)
- Android实战(橘子娱乐)-首页(第一篇 MVP框架基本搭建和实现准备)
- Google图片加载库Glide的简单封装GlideUtils
- Google图片加载库Glide的简单封装GlideUtils
- Android图片加载库的封装实战
- Android图片加载库的封装实战
- Glide图片加载神器----官方库wiki说明文档的翻译(首页)
- Android 图片加载库Glide 实战(二),占位符,缓存,转换自签名高级实战
- Android 流行的网络图片加载库 之 使用 Glide 加载图片 (Google推荐的图片加载库Glide)
- Android中Glide(加载图片)的使用
- Android 图片加载库Glide的使用(文章链接)
- Android之Glide(非常好用的图片加载框架)
- Android之Glide(非常好用的图片加载框架)
- Android Glide加载图片(基础1)
- Python杂谈
- 聊聊mysql 索引及周边
- kRpano 360动态热点添加方式
- 数据重复提交
- CoInitialize和CoUninitialize
- Android实战(橘子娱乐)-首页(第五篇 Glide加载图片的简单封装)
- 服务器虚拟化技术 对比简介
- Mac下Clion编译错误:Undefined symbols for architecture x86_64
- python爬虫实例项目大全
- Keras深度学习框架学习笔记系列(1)- IndentationError错误问题
- 我的资源
- 【LeetCode】C# 90、Subsets II
- mysql四种存储引擎
- tf的“SAME”和“VALID”