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

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

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是全尺寸的缓存,每当重新加载时,需要重新绘制

1 /**

2 * Glide的全尺寸缓存3 */

4 public voidGlideImage3(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 }

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

1 /**

2 * 更改Glide的bitmap的格式为ARGB_88883 * Created by joe.xiang on 2016/6/9.4 */

5 public class GlideConfigration implementsGlideModule {6

7

8 @Override9 public voidapplyOptions(Context context, GlideBuilder builder) {10 builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);11 }12

13 @Override14 public voidregisterComponents(Context context, Glide glide) {15

16 }17 }

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

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

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

5、Glide如何设置圆形图片

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

1、自定一个Transform 继承 BitmapTransformation

1 /**

2 * Created by joe.xiang on 2016/6/9.3 */

4 public class CircleTransform extendsBitmapTransformation {5

6 publicCircleTransform(Context context) {7 super(context);8 }9

10 @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, intoutHeight) {11 returncircleCrop(pool, toTransform);12 }13

14 private staticBitmap 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 = newCanvas(result);27 Paint paint = newPaint();28 paint.setShader(newBitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));29 paint.setAntiAlias(true);30 float r = size /2f;31 canvas.drawCircle(r, r, r, paint);32 returnresult;33 }34

35 @Override publicString getId() {36 returngetClass().getName();37 }38 }

1 /**

2 * 通过Glide的TransForMation 自定义圆形图片的bitmap3 */

4 public voidRoundImage(String url) {5 Glide.with(this)6 .load(url)7 .asBitmap()8 .transform(new CircleTransform(this))9 .into(glide_image5);10 }

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

1 /**

2 * 通过RoundBitmapDrawable3 */

4 public voidRoundImage2(String url) {5 Glide.with(this)6 .load(url)7 .asBitmap()8 .into(newBitmapImageViewTarget(glide_image6) {9 @Override10 protected voidsetResource(Bitmap resource) {11 RoundedBitmapDrawable RoundedBitmapDrawable = RoundedBitmapDrawableFactory.create(Glide_1.this.getResources(), resource);12 RoundedBitmapDrawable.setCircular(true);13 glide_image6.setImageDrawable(RoundedBitmapDrawable);14 }15 });16

3、我们可以通过自定义RoundedCornerLayout 继承RelavityLayout来实现圆角图片效果

1 **

2 * Created by joe.xiang on 2016/6/9.3 */

4 public class RoundedCornerLayout extendsRelativeLayout {5 privateBitmap maskBitmap;6 privatePaint paint;7 private floatcornerRadius;8

9 publicRoundedCornerLayout(Context context) {10 super(context);11 init(context, null, 0);12 }13

14 publicRoundedCornerLayout(Context context, AttributeSet attrs) {15 super(context, attrs);16 init(context, attrs, 0);17 }18

19 public RoundedCornerLayout(Context context, AttributeSet attrs, intdefStyle) {20 super(context, attrs, defStyle);21 init(context, attrs, defStyle);22 }23

24 private void init(Context context, AttributeSet attrs, intdefStyle) {25 paint = newPaint(Paint.ANTI_ALIAS_FLAG);26

27 setWillNotDraw(false);28 }29

30 @Override31 public voiddraw(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 circular36 //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, intheight) {45 Bitmap mask =Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);46 Canvas canvas = newCanvas(mask);47

48 Paint paint = newPaint(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(newPorterDuffXfermode(PorterDuff.Mode.CLEAR));54 canvas.drawRoundRect(new RectF(0, 0, width, height), cornerRadius, cornerRadius, paint);55 returnmask;56 }57 }

1

3 android:layout_height="200dp">

4

6 android:layout_width="200dp"

7 android:layout_height="200dp"

8 android:scaleType="centerCrop"

9 />

10

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

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

1 Glide.with(this).load(url).into(new SimpleTarget() {2 @Override3 public void onResourceReady(GlideDrawable resource, GlideAnimation super GlideDrawable>glideAnimation) {4 //使用自定义的圆角图片

5 }6 });

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

3311b1ec77e501a36dc5a6e9885f2393.png

原文:http://www.cnblogs.com/xianglinglong/p/5578466.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值