Glid简单使用(一)

    xiaoxiao2021-03-25  66

    一、引入项目

    添加依赖

    dependencies { compile 'com.github.bumptech.glide:glide:3.5.2' compile 'com.android.support:support-v4:22.0.0' }

    二、最简单加载图片

    Glide.with(context) .load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg") .into(ivImg);

    三、其他特性

    Glide缓存全尺寸

    Glide.with(this) .load("http://nuuneoi.com/uploads/source/playstore/cover.jpg") .diskCacheStrategy(DiskCacheStrategy.ALL) .into(ivImgGlide);

    设置占位图或者加载错误图:

    .placeholder(R.drawable.placeholder) .error(R.drawable.imagenotfound)

    ③加载gif

    String gifUrl = "xxxxx"; Glide.with( context ).load( gifUrl ).into( imageViewGif );

    一些常规方法(待加载时显示,加载出错时显示

    Glide.with( context ).load( gifUrl ).placeholder( R.drawable.cupcake ).error( R.drawable.full_cake ).into( imageViewGif );

    ④强制转化为gif

    Glide.with( context ).load( gifUrl ).asGif().error( R.drawable.full_cake ).into( imageViewGif );

    ⑤用bitMap播放Gif

    Glide.with( context ).load( gifUrl ).asBitmap().into( imageViewGifAsBitmap );

    ⑥播放本地mp4,只能是本地

    String filePath = "/storage/emulated/0/Pictures/example_video.mp4"Glide.with( context ).load( Uri.fromFile( **new **File( filePath ) ) ).into( imageViewGifAsBitmap );

    在上面这些等价ScrollView中,Glide会自动的请求取消,清楚ImageView,在合适的ImageView中加载合适的Image.当需要裁剪大小时,有个*.centerCrop*方法,这个方法的裁剪会让你的ImageView周围不会留白,还有一个.fitCenter()方法,表示让你的Image完全显示,尺寸不对时,周围会留白。

    ⑧加点动画渐显动画

    Glide.with(context) .load().placeholder(R.mipmap.ic_launcher) .error(R.mipmap.future_studio_launcher) .crossFade() .into(imageViewFade);

    ⑨调整图片大小.resize(int ,int )

    单位是像素,裁剪你的图片大小。其实Glide已经会自动根据你mageView裁剪照片来放在缓存中了。但是不想适应ImageView大小的时候,可以调用这个方法.override()。

    Glide.with(context) .load(image) .override(600, 200) .into(imageViewResize);

    ⑩裁剪图片

    .fitCenter和.CenterCrop

    来点缩略图

    .thumbnail()方法的目的就是让用户先看到一个低解析度的图,点开后,再加载一个高解析度的图。

    Glide. with( context ) .load(image) .thumbnail( 0.1f )//表示为原图的十分之一 .into( imageView2 );

    外存缓存机制

    Glide默认会缓存Image的很多个版本,比如原图,如果你的imageView大小的缓存。.diskCacheStrategy( )有以下几种缓存策略:

    DiskCacheStrategy.NONE 什么都不缓存DiskCacheStrategy.SOURCE 只缓存最高解析图的imageDiskCacheStrategy.RESULT 缓存最后一次那个image,比如有可能你对image做了转化DiskCacheStrategy.ALL image的所有版本都会缓存 Glide.with( context ).load( image ) .diskCacheStrategy( DiskCacheStrategy.SOURCE ) .into( imageViewFile );

    请求优先级.request()

    加载图片肯定也是有先后顺序,Glide提供了.request()这个方法,它接收以下几个参数:Priority.LOWPriority.NORMALPriority.HIGHPriority.IMMEDIATE 但是Glide并不一定会按照你的顺序来,只是尽量按照你的顺序来。

    利用callback在非标准情况下加载图片

    上名所有的情况都是加载图片到ImageView中,但是并不是所有的情况都是这样。

    Glide中的回调:Targets

    从上面的介绍,已经可以看出Glide内部封装了所有的细节,什么网络请求,什么缓存机制,当所有都就绪过后,自动切换回UI线程,更新ImageView。Targets就是Glide中的回调,当异步线程中所有的工作做完过后返回结果。说白了就是,当请求图片完成后,需要回调的方法。

    SimplerTarget
    private SimpleTarget target = new SimpleTarget<Bitmap>() { @Override public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) { // do something with the bitmap// for demonstration purposes, let's just set it to an ImageView imageView1.setImageBitmap( bitmap ); } }; private void loadImageSimpleTarget() { Glide.with( context ) *// could be an issue!* .load( eatFoodyImages[0] ) .asBitmap()//强制Glide返回一个Bitmap .into( target );}

    注意事项:

    上面这段代码不要写成匿名内部类的机制,原因就是java的自动垃圾回收机制可能在图片还没有加载好的时候就已经把你的Target回收了。注意.with()里面的参数,Glide的请求是和传进去的Context共存亡的,如果传一个Activity进去,当Activity GG过后,你的请求也就GG了,但是如果这样传:.with(context.getApplicationContext() ).当你的Activity GG过后,请求还是会继续,回调还是会继续。
    有size的Target
    如果传给.into()的是一个ImageView,但是图片的size比ImageView的Size打,Glide为了节省时间,会加载小的那个size的Image。但是这对Target并不适用,以为这里并不知道SIze。但是如果知道image应该多大,可以传递给Target.就像下面这样: private SimpleTarget target2 = new SimpleTarget<Bitmap>( 250, 250 ) { @Override public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {imageView2.setImageBitmap( bitmap ); } }; private void loadImageSimpleTargetApplicationContext() { Glide.with( context.getApplicationContext() ) *// safer!* .load( eatFoodyImages[1] ) .asBitmap() .into( target2 ); }
    ViewTarget
    适用于想Glide加载到自定义View中去, public class FutureStudioView extends FrameLayout { ImageView iv; TextView tv; public void nitialize(Context context) { inflate( context, R.layout.custom_view_futurestudio, this ); iv = (ImageView) findViewById( R.id.custom_view_image ); tv = (TextView) findViewById( R.id.custom_view_text ); } public FutureStudioView(Context context, AttributeSet attrs) { super( context, attrs ); initialize( context ); } public FutureStudioView(Context context,AttributeSet attrs,int defStyleAttr) { super( context, attrs, defStyleAttr ); initialize( context ); } public void setImage(Drawable drawable) { iv = (ImageView) findViewById( R.id.custom_view_image ); iv.setImageDrawable( drawable ); }}

     

    转载请注明原文地址: https://ju.6miu.com/read-38480.html

    最新回复(0)