乐码库:一个极速、放心、纯净的下载站! 更新: 资源发布
  • 您的位置:首页 > 技术文档 > AndRoid > Android Glide图片加载(加载监听、加载动画)
  • 收藏本页
      Android Glide图片加载(加载监听、加载动画)
      发布时间:2016-12-21 08:08:36 关键词: Android,Glide,图片加载
      内容简介:这篇文章主要为大家详细介绍了Android Glide图片加载的具体实现方法,包括加载监听、加载动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

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

      最新更新
      热门排行榜