Android Glide图片加载(加载监听、加载动画)

作者:zhihui_520 时间:2022-08-27 08:31:24 

本文实例为大家分享了Android Glide图片加载的具体代码,供大家参考,具体内容如下

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);

注意事项:

不能直接给要使用glide的imageview设置tag;

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

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

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

标签:Android,Glide,图片加载
0
投稿

猜你喜欢

  • java实现1M图片压缩优化到100kb实现示例

    2022-08-08 03:59:43
  • ShardingSphere jdbc集成多数据源的实现步骤

    2023-11-25 07:54:56
  • 完整详解Java开发学习路线指南

    2023-05-13 08:34:35
  • C#利用Random得随机数求均值、方差、正态分布的方法

    2022-08-28 14:26:37
  • 源码阅读之storm操作zookeeper-cluster.clj

    2022-06-01 13:21:48
  • c#定时器和global实现自动job示例

    2023-10-04 22:30:29
  • android异步消息机制 源码层面彻底解析(1)

    2023-10-02 07:08:52
  • Java和C#输入输出流的方法(详解)

    2022-06-24 09:21:02
  • Java中i++的一些问题总结

    2022-04-11 18:07:34
  • C# datagrid非常规方法实现添加合并列

    2023-02-08 07:31:00
  • spring boot RestTemplate 发送get请求的踩坑及解决

    2022-01-19 16:08:09
  • 一篇文章带你搞懂Java线程池实现原理

    2021-10-23 05:45:36
  • SpringBoot + SpringSecurity 短信验证码登录功能实现

    2022-10-16 10:26:25
  • Mybatis的特点及优点

    2022-11-19 16:27:54
  • Java 详解Collection集合之ArrayList和HashSet

    2021-09-10 06:27:02
  • C#多线程死锁介绍与案例代码

    2022-08-01 06:40:05
  • 详解mybatis generator代码生成器的使用

    2021-08-28 09:05:42
  • 详解怎么用Java的super关键字

    2021-10-06 08:11:14
  • Java获取时间年、月、日的方法

    2022-02-10 16:58:36
  • Android仿微信语音聊天功能

    2022-11-24 03:36:12
  • asp之家 软件编程 m.aspxhome.com