欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-02-29 16:00:40
本文实例为大家分享了android glide图片加载的具体代码,供大家参考,具体内容如下 1.普通用法 glide.with(context) .load(...

本文实例为大家分享了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);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。