[置顶] Android Glide图片加载(加载监听、加载动画)

标签: glide 图片缓存 image圆形图
29377人阅读 评论(3) 收藏 举报
分类:

1.普通用法

Glide.with(context)
.load(url)
.into(view);

with中可以放context、activity、fragment。。;当放activity、fragment时glide会根据生命周期来加载图片。推荐使用activity。

2.设置加载中和加载失败的图片

Glide.with(context)
.load(url)
.placeholder(R.drawable.loading) //占位符 也就是加载中的图片,可放个gif
.error(R.drawable.failed) //失败图片
.into(view);

3.添加图片淡入加载的效果

.crossFade()

4.用 animate() 自定义动画

从资源中的动画:

回到代码,第一个选项是传一个 Android 资源 id,即动画的资源。一个简单的例子是每个 Android 系统都提供的:slide-in-left(从左滑入)动画, android.R.anim.slide_in_left 。下面这段代码是这个动画的 XML 描述:

<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android">  
    <translate android:fromXDelta="-50%p" android:toXDelta="0"
            android:duration="@android:integer/config_mediumAnimTime"/>
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
            android:duration="@android:integer/config_mediumAnimTime" />
</set>

当然你可以创建你自己的 XML 动画。比如一个小的缩放动画,图片刚开始小的,然后逐渐增大到原尺寸。

<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android"  
     android:fillAfter="true">

    <scale
        android:duration="@android:integer/config_longAnimTime"
        android:fromXScale="0.1"
        android:fromYScale="0.1"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1"
        android:toYScale="1"/>
</set>  

这两个动画都可以用到 Glide 建造者中:

Glide  
    .with( context )
    .load( eatFoodyImages[0] )
    .animate( android.R.anim.slide_in_left ) // or R.anim.zoom_in
    .into( imageView1 );

在图片从网络加载完并准备好之后将从左边滑入。

通过自定义类实现动画

这个很简单,你只需实现 void animate(View view) 方法。这个视图对象是整个 target 视图。如果它是一个自定义的视图,你要找到你的视图的子元素,并且做些必要的动画。

来看个简单的例子。假设你想要实现一个渐现动画,你得需要创建这样的动画对象:

ViewPropertyAnimation.Animator animationObject = new ViewPropertyAnimation.Animator() {  
    @Override
    public void animate(View view) {
        // if it's a custom view class, cast it here
        // then find subviews and do the animations
        // here, we just use the entire view for the fade animation
        view.setAlpha( 0f );

        ObjectAnimator fadeAnim = ObjectAnimator.ofFloat( view, "alpha", 0f, 1f );
        fadeAnim.setDuration( 2500 );
        fadeAnim.start();
    }
};

接下来,你需要在 Glide 请求中去设置这个动画:

Glide  
    .with( context )
    .load( eatFoodyImages[1] )
    .animate( animationObject )
    .into( imageView2 );

当然,在 animate(View view) 中你的动画对象方法中, 你可以做任何你想要对视图做的事情。自由的用你的动画创建吧。

如果你要在你的自定义视图中实现,你只需要创建这个视图对象,然后在你的自定义视图中创建你的自定义方法。

5.添加加载完成监听

Glide.with(ShowImgActivity.this)
     .load(urlString)
     .centerCrop()
     .error(R.drawable.failed)
     .crossFade()
     .into(new GlideDrawableImageViewTarget(imageView) {
 @Override
     public void onResourceReady(GlideDrawable drawable, GlideAnimation anim) {
     super.onResourceReady(drawable, anim);
     //在这里添加一些图片加载完成的操作
    }
)};

6.图片缓存机制

Glide缓存策略

Glide默认开启磁盘缓存和内存缓存,当然也可以对单张图片进行设置特定的缓存策略。
设置图片不加入到内存缓存

Glide  
    .with( context )
    .load( eatFoodyImages[0] )
    .skipMemoryCache( true )
    .into( imageViewInternet );

设置图片不加入到磁盘缓存

Glide  
    .with( context )
    .load( eatFoodyImages[0] )
    .diskCacheStrategy( DiskCacheStrategy.NONE )
    .into( imageViewInternet );

Glide支持多种磁盘缓存策略:

DiskCacheStrategy.NONE :不缓存图片
DiskCacheStrategy.SOURCE :缓存图片源文件
DiskCacheStrategy.RESULT:缓存修改过的图片
DiskCacheStrategy.ALL:缓存所有的图片,默认

图片加载优先级

Glide支持为图片加载设置优先级,优先级高的先加载,优先级低的后加载:

private void loadImageWithHighPriority() {  
    Glide
        .with( context )
        .load( UsageExampleListViewAdapter.eatFoodyImages[0] )
        .priority( Priority.HIGH )
        .into( imageViewHero );
}

private void loadImagesWithLowPriority() {  
    Glide
        .with( context )
        .load( UsageExampleListViewAdapter.eatFoodyImages[1] )
        .priority( Priority.LOW )
        .into( imageViewLowPrioLeft );

    Glide
        .with( context )
        .load( UsageExampleListViewAdapter.eatFoodyImages[2] )
        .priority( Priority.LOW )
        .into( imageViewLowPrioRight );
}

7.加载圆角图片

/**
 * 圆形图
 *
 * Created by <lzh> on 2016/7/29.
 */
public class GlideCircleTransform extends BitmapTransformation {
    public GlideCircleTransform(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;
        // TODO this could be acquired from the pool too
        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();
        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();
    }
}

**然后使用的时候只要加上这句话就行了
.transform(new GlideCircleTransform(context))**

Glide.with(mContext)
                .load(imageUrl)
                .transform(new GlideCircleTransform(mContext))
                .into(holder.imageView);

8.主要事项(setTag)

相信有朋友在项目中设置tag是会出现如下异常吧
java.lang.IllegalArgumentException: You must not call setTag() on a view Glide is targeting

我们不能直接给要使用glide的imageview设置tag,

因为glide在加载图片的时候用到了tag,会造成冲突,并报错。

当要用到tag写逻辑代码的时候,可以这样

.setTag(R.string.xxx,xxx);并.getTag(R.string.xxx);

9.加载图片时背景出现浅绿色现象

原因:
Glide默认的Bitmap格式是RGB_565,这也是导致在加载图片是可能变绿的罪魁祸首。RGB_565代表8位RGB位图,而Picasso默认的Bitmap格式是ARGB_8888代表32位RGB位图,位图位数越高代表其可以存储的颜色信息越多,图像也就越逼真,这也是Picasso图像质量更好的原因了。

相信有朋友看到这里就已经明白了,只要我们将我们的Glide设置为ARGB_8888就可以啦,对没错,其实还有一种较为简单,只需要将显示的网络图片进行全尺寸缓存

1、使用Glide加载图片时,将原尺寸缓存到本地。:

Glide.with(context)
     .load(url)
     .diskCacheStrategy(DiskCacheStrategy.SOURCE)//是将图片原尺寸缓存到本地。
     .into(imageview);

2、将Bitmap的格式改为ARGB_8888。 首先创建一个 GlideConfiguration类去实现GlideModule,修改Bitmap的格式。

public class GlideConfiguration implements GlideModule{  
    @Override  
    public void applyOptions(Context context, GlideBuilder builder) {  
        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);  
    }    
    @Override  
    public void registerComponents(Context context, Glide glide) {  

    }  
}

然后在AndroidManifest.xml中加入:

<meta-data  
    android:name="你的包名.GlideConfiguration"  
    android:value="GlideModule"/>
查看评论

Android前沿技术—《Glide》

Glide是一款谷歌官方推荐使用的强大图片加载框架。它具有使用非常简单、可配置度高、加载的图片格式丰富、加载的图片路径多种、高效的缓存策略和与Activity/Fragment生命周期绑定等特点。本视频详细讲解了Glide的基本使用、在RecyclerView中加载图片和图片变换等功能。
  • 2016年11月21日 11:12

详谈高大上的图片加载框架Glide -应用篇

在Android设备上,加载网络图片一直是一个头疼的问题,因为Android设备种类繁多(当然最主要的是配置),处理的稍不周到轻则应用卡顿,严重者就会出现OOM的,导致程序挂掉。现如今网络上有很多图片...
  • xiehuimx
  • xiehuimx
  • 2016-08-29 23:00:07
  • 15212

关于Glide图片加载框架的使用详解

如果出去面试说不知道Glide,我觉得稍微有点不太合适吧.用法也没有那么复杂. 最新Glide 4.0使用详解请看Glide第二篇博客Glide4.0使用详解gradle 引用方式 compil...
  • EaskShark
  • EaskShark
  • 2016-05-11 14:03:48
  • 11646

Glide图片加载库的使用

Glide是 Google推荐的图片加载库,它可以支持来自url,Android资源,文件,Uri中的图片加载,同时还支持gif图片的加载,以及各种图片显示前的bitmap处理(例如:圆角图片,圆形图...
  • mChenys
  • mChenys
  • 2016-06-06 23:21:50
  • 11084

Android图片加载框架最全解析(一),Glide的基本用法

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/53759439 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微...
  • u010142437
  • u010142437
  • 2017-04-20 09:40:15
  • 6008

图片加载之Glide使用

Glide的基本用法
  • my_rabbit
  • my_rabbit
  • 2017-03-31 16:52:40
  • 4925

Glide-占位图以及加载动画

前言:这一节我们将讲到Glide如何使用占位图,错误图,以及使用加载动画Glide 系列目录 Glide入门教程 [Glide-占位图以及加载动画] 1.设置占位图(placeholder)有时候加载...
  • yulyu
  • yulyu
  • 2017-02-13 21:02:29
  • 11513

Android实战——Glide的使用,加载图片只要一句话

本篇文章包括以下内容: 前言Glide的简介Glide的配置Glide的使用结语 前言 用过的人都知道,加载图片哪家强,只有Glide,由于Glide采用链式调用,所以加载图片只...
  • qq_24531461
  • qq_24531461
  • 2017-03-18 08:47:52
  • 499

图片加载框架Glide使用详解

最终我还是决定使用Glide,作为我以后的主要图片加载框架。主要基于三点考虑 代码提交频率频繁,有人维护,不至于出现问题,我自己和基友都搞不定的时候问题无法解决。(ImageLoader已没人维护...
  • zivensonice
  • zivensonice
  • 2016-07-16 03:20:39
  • 19453

图片加载框架Glide使用教程

Glide,和Picasso很相似,可以从各种图片来源加载和显示图片,并且很好的支持缓存。同时,它在对图片操作时,只占用很少的内存。Glide已经被谷歌官方的应用程序所使用(如2015年的 Googl...
  • jiangxuqaz
  • jiangxuqaz
  • 2016-01-02 20:42:01
  • 26693
    个人资料
    等级:
    访问量: 4万+
    积分: 323
    排名: 24万+
    最新评论
    底部跑马灯