聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso

时间:2023-01-11 20:51:59

今天总结下有关Android的图片开源框架UIL、Glide、Picasso、当然不止这些还有okhttp、xutlis、afinal、andbase、volley等等,今天主要是对于Glide使用进行总结。



android stduio导入Glide


repositories {
mavenCentral() // jcenter() works as well because it pulls from Maven Central
}

dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-v4:19.1.0'
}

Glide是谷歌推荐使用的加载图片的框架,它相对于其他的框架有更多的有点,说到Glide我们不得不谈谈Picasso,为什么呢?这是因为Picasso的使用与Glide的使用上非常的相似,但是细细看,有明显不同,首先我们看下Picasso与Glide的基本用法?

Picasso:            包,

1   Picasso.with(this)
2 .load(url)//加载图片
3 .placeholder(R.mipmap.ic_launcher)//正在加载时的图片
4 .error(R.mipmap.ic_launcher)//加载错误是的图片
5 .into(glide_image2);

Glide:

1  Glide.with(this)
2 .load(url)//加载图片
3 .placeholder(R.mipmap.ic_launcher)//正在加载时的图片
4 .error(R.mipmap.ic_launcher)//加载错误是的图片
5 .into(glide_image);

1、看到没有,是不是一样呢,基本上它们的用法一直,但是我们在使用Glide时需要注意,Glide.with(this),我们在传入的时候,我建议传入Actitiy,Fragment对应得context,而不是全局的context,为什么呢,这是因为这样我们可以让Gilde加载图片与我们的Activity,Fragment的生命周期一直,创建时去加载,销毁时停止加载,

2、Glide的加载速度比Picasso的加载速度要快,但是消耗的内存要比Picasso的内存高,为什么呢这是因为Gilde他是根据你传入的尺寸进行缓存,如果俩个地方需要      全尺寸缓存,另一个地方按照比例缓存,那么Glide需要缓存俩次,而Picsso是全尺寸的缓存,每当重新加载时,需要重新绘制

聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso
 1  /**
2 * Glide的全尺寸缓存
3 */
4 public void GlideImage3(String url) {
5 Glide.with(this)
6 .load(url)//加载图片
7 .placeholder(R.mipmap.ic_launcher)//正在加载时的图片
8 .error(R.mipmap.ic_launcher)//加载错误是的图片
9 .diskCacheStrategy(DiskCacheStrategy.ALL)
10 .into(glide_image);
11 }
聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso

 

3,Picasso加载的bitmap格式ARGB_8888而Glide所加载的bitmap格式ARGB_565当然我们可以通过实现GlideMenu来实现

聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso
 1 /**
2 * 更改Glide的bitmap的格式为ARGB_8888
3 * Created by joe.xiang on 2016/6/9.
4 */
5 public class GlideConfigration implements GlideModule {
6
7
8 @Override
9 public void applyOptions(Context context, GlideBuilder builder) {
10 builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
11 }
12
13 @Override
14 public void registerComponents(Context context, Glide glide) {
15
16 }
17 }
聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso

 

4、Glide的setTag方法不同之处?

   我们可以通过在我们的values下建立一个ids的xml

1234 <?xml
version=
"1.0" encoding="utf-8"?>
<resources>    <item name="image_tag" type="id"/></resources>

通过Image.setTag(R.id.image_tag,url)的形式来进行设置

 

 

5、Glide如何设置圆形图片

    对于如何制作圆形的方法,有很多可以通过自定义ImageView,当然Glide也给我们提供了很多的方法来时圆角图片。一般有一下方法

    1、自定一个Transform 继承 BitmapTransformation

聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso
 1 /**
2 * Created by joe.xiang on 2016/6/9.
3 */
4 public class CircleTransform extends BitmapTransformation {
5
6 public CircleTransform(Context context) {
7 super(context);
8 }
9
10 @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
11 return circleCrop(pool, toTransform);
12 }
13
14 private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
15 if (source == null) return null;
16 int size = Math.min(source.getWidth(), source.getHeight());
17 int x = (source.getWidth() - size) / 2;
18 int y = (source.getHeight() - size) / 2;
19
20 // TODO this could be acquired from the pool too
21 Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
22 Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
23 if (result == null) {
24 result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
25 }
26 Canvas canvas = new Canvas(result);
27 Paint paint = new Paint();
28 paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
29 paint.setAntiAlias(true);
30 float r = size / 2f;
31 canvas.drawCircle(r, r, r, paint);
32 return result;
33 }
34
35 @Override public String getId() {
36 return getClass().getName();
37 }
38 }
聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso
聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso
 1   /**
2 * 通过Glide的TransForMation 自定义圆形图片的bitmap
3 */
4 public void RoundImage(String url) {
5 Glide.with(this)
6 .load(url)
7 .asBitmap()
8 .transform(new CircleTransform(this))
9 .into(glide_image5);
10 }
聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso

 

 2、我们可以通过BitmapImageVieTarget,来得到一个带圆角的RoundBitmapDrawable;

聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso
 1  /**
2 * 通过RoundBitmapDrawable
3 */
4 public void RoundImage2(String url) {
5 Glide.with(this)
6 .load(url)
7 .asBitmap()
8 .into(new BitmapImageViewTarget(glide_image6) {
9 @Override
10 protected void setResource(Bitmap resource) {
11 RoundedBitmapDrawable RoundedBitmapDrawable = RoundedBitmapDrawableFactory.create(Glide_1.this.getResources(), resource);
12 RoundedBitmapDrawable.setCircular(true);
13 glide_image6.setImageDrawable(RoundedBitmapDrawable);
14 }
15 });
16
聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso


3、我们可以通过自定义RoundedCornerLayout 继承RelavityLayout来实现圆角图片效果
聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso
 1 **
2 * Created by joe.xiang on 2016/6/9.
3 */
4 public class RoundedCornerLayout extends RelativeLayout {
5 private Bitmap maskBitmap;
6 private Paint paint;
7 private float cornerRadius;
8
9 public RoundedCornerLayout(Context context) {
10 super(context);
11 init(context, null, 0);
12 }
13
14 public RoundedCornerLayout(Context context, AttributeSet attrs) {
15 super(context, attrs);
16 init(context, attrs, 0);
17 }
18
19 public RoundedCornerLayout(Context context, AttributeSet attrs, int defStyle) {
20 super(context, attrs, defStyle);
21 init(context, attrs, defStyle);
22 }
23
24 private void init(Context context, AttributeSet attrs, int defStyle) {
25 paint = new Paint(Paint.ANTI_ALIAS_FLAG);
26
27 setWillNotDraw(false);
28 }
29
30 @Override
31 public void draw(Canvas canvas) {
32 super.draw(canvas);
33
34 if (maskBitmap == null) {
35 // This corner radius assumes the image width == height and you want it to be circular
36 // Otherwise, customize the radius as needed
37 cornerRadius = canvas.getWidth() / 2;
38 maskBitmap = createMask(canvas.getWidth(), canvas.getHeight());
39 }
40
41 canvas.drawBitmap(maskBitmap, 0f, 0f, paint);
42 }
43
44 private Bitmap createMask(int width, int height) {
45 Bitmap mask = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
46 Canvas canvas = new Canvas(mask);
47
48 Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
49 paint.setColor(Color.WHITE); // TODO set your background color as needed
50
51 canvas.drawRect(0, 0, width, height, paint);
52
53 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
54 canvas.drawRoundRect(new RectF(0, 0, width, height), cornerRadius, cornerRadius, paint);
55 return mask;
56 }
57 }
聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso
聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso
 1   <huanxin.exmaple.com.android_glidedemo.RoundedCornerLayout
2 android:layout_width="200dp"
3 android:layout_height="200dp">
4 <ImageView
5 android:id="@+id/glide_image7"
6 android:layout_width="200dp"
7 android:layout_height="200dp"
8 android:scaleType="centerCrop"
9 />
10 </huanxin.exmaple.com.android_glidedemo.RoundedCornerLayout>
聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso

使用上跟一般使用没什么区别。。。。。

4 、当然我们亦可以使用开源的圆角图片的自定义控件?

聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso
1   Glide.with(this).load(url).into(new SimpleTarget<GlideDrawable>() {
2 @Override
3 public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
4 //使用自定义的圆角图片
5 }
6 });
聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso

对于Glide加载图片还有很多可以去研究的地方,它还可以加载gif的动态图,不过这个方法要谨慎使用,因为这个非常耗内存,对于Glide的使用花了一个下午对于他的一些基本使用就总结导致,过段时间深入研究后在总结了、一下附上加载的图片效果图。

聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso