前言
因为项目中使用了Glide,同时了为了兼容性,所以在加载圆角和圆形图片的时候,是使用Gilde来实现,而不是通过自定义控件,此文是记录下如果通过Glide加载圆形和圆角图片,以及在使用Glide中常用的一些方法
加载有效果的图片方式
Glide可以通过设置transform或者设置bitmapTransform来实现各种现实效果,本文是通过设置transform来实现的圆角和圆形图片
加载圆角图片
调用代码
1 2 3 4 5 6
| Glide.with(activity).load(uri).centerCrop().diskCacheStrategy(DiskCacheStrategy.ALL) .transform(new CornersTransform(activity)) .placeholder(R.drawable.ic_gf_default_photo) .error(R.drawable.ic_gf_default_photo) .crossFade() .into(imageView);
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.RectF;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
public class CornersTransform extends BitmapTransformation { private float radius; public CornersTransform(Context context) { super(context); radius = 10; }
public CornersTransform(Context context,float radius){ super(context); this.radius = radius; }
@Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { return cornersCrop(pool,toTransform); } private Bitmap cornersCrop(BitmapPool pool, Bitmap source) { if (source == null) return null;
Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); if (result == null) { result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); }
Canvas canvas = new Canvas(result); Paint paint = new Paint(); paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); paint.setAntiAlias(true); RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight()); canvas.drawRoundRect(rectF, radius, radius, paint); return result; }
@Override public String getId() { return getClass().getName(); } }
|
加载圆形图片
1 2 3 4 5 6
| Glide.with(activity).load(uri).centerCrop().diskCacheStrategy(DiskCacheStrategy.ALL) .transform(new CircleTransform(activity)) .placeholder(R.drawable.ic_gf_default_photo) .error(R.drawable.ic_gf_default_photo) .crossFade() .into(imageView);
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
public class CircleTransform extends BitmapTransformation { public CircleTransform(Context context) { super(context); }
@Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { return circleCrop(pool,toTransform); } private Bitmap circleCrop(BitmapPool pool, Bitmap source) {
int size = Math.min(source.getWidth(), source.getHeight());
int width = (source.getWidth() - size) / 2; int height = (source.getHeight() - size) / 2;
Bitmap bitmap = pool.get(size, size, Bitmap.Config.ARGB_8888); if (bitmap == null) { bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); }
Canvas canvas = new Canvas(bitmap); Paint paint = new Paint(); BitmapShader shader = new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP); if (width != 0 || height != 0) { Matrix matrix = new Matrix(); matrix.setTranslate(-width, -height); shader.setLocalMatrix(matrix); } paint.setShader(shader); paint.setAntiAlias(true);
float r = size / 2f; canvas.drawCircle(r, r, r, paint);
return bitmap; }
@Override public String getId() { return getClass().getName(); } }
|
获取缓存大小
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
private static long calculateSize(File dir) { if (dir == null) return 0; if (!dir.isDirectory()) return dir.length(); long result = 0; File[] children = dir.listFiles(); if (children != null) for (File child : children) result += calculateSize(child); return result; } long totalSize = calculateSize(new File(getCacheDir(), DiskCache.Factory.DEFAULT_DISK_CACHE_DIR));
|
==**注意:**==calculateSize方法必须要在非UI线程调用,因为计算缓存默认是耗时操作,如果在UI线程调用,会抛异常,计算出来的结果可以通过
1
| android.text.format.Formatter.formatFileSize(getContext(), totalSize );
|
进行格式化
获取指定URL的缓存地址
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
public static String getImgPath(String url,Context context){ FutureTarget<File> future = Glide.with(context) .load(url) .downloadOnly(500, 500); try { File cacheFile = future.get(); return cacheFile.getAbsolutePath(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } return null; }
|
==**注意:**==这个方法也必须要在非UI线程调用,否则会抛异常,当然我怀疑这个如果没有缓存,是会从网络下载下来,再缓存,最后返回的
清理缓存
1
| Glide.get(context).clearDiskCache();
|
结尾
以上就是我在使用Glide中的一些笔记,记录下来方便下次使用,当然如果你看到了你想要的东西就更好了,最近天天加班忙成狗,新版APP上线了,终于得空写下博客了。最后欢迎大家吐槽交流(QQ群:123965382)