glide采用的都是流接口方式java
Glide.with(context).load(internetUrl).into(targetImageView);
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"Test.jpg"); Glide.with(context).load(file).into(imageViewFile);
int resourceId = R.mipmap.ic_launcher; Glide.with(context).load(resourceId).into(imageViewResource);
Glide.with(context).load(uri).into(imageViewUri);
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 );
Glide.with( context ).load( gifUrl ).asGif().error( R.drawable.full_cake ).into( imageViewGif );
Glide.with( context ).load( gifUrl ).asBitmap().into( imageViewGifAsBitmap );
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彻底显示,尺寸不对时,周围会留白。这里有惊喜,圆ImageViewnode
等会儿补充
用过手机的都知道,当划上划下一个ListView的时候,第二次都比第一次快,就是由于为GlideView对资源进行了缓存,并且封装的很好,甚至不须要本身去设定缓存大小,Glide会智能地本身给咱们根据设备设置缓存大小。缓存
听名字都知道这家伙是干吗的,加载图片,可是图片尚未加载完的时候,总不能给用户看空白吧,这个就是用来填充着一段是时间的。网络
Glide.with(context). load(UsageExampleListViewAdapter.eatFoodyImages[0]) .placeholder(R.mipmap.ic_launcher) *// 一样也能够是drawble .into(imageViewPlaceholder);
这里只能用本地资源,不能用网络资源,由于网络资源也有可能加载不出来。dom
其实大多数时候用placeHolder就能够了。异步
Glide.with(context) .load("http://futurestud.io/non_existing_image.png") .placeholder(R.mipmap.ic_launcher) // 一样也能够是drawble .error(R.mipmap.future_studio_launcher)// 当不能加载时载入
除了上面两种‘异常状况’,还有一种情形就是打开手机的通信录的时候,能够看到你给有些喜欢的人设置了照片,然而有些可怜的人并没给有,总不能在那里留下一片空白吧,这个时候至关于传递了Null,传递null时,这个callback方法就会被调用,推荐在这里给我设置一张吴彦祖或者小贝的照片。嗯。。(QAQ)ide
Glide.with(context) .load( null)//加载空指针的时候 .fallback( R.drawable.wuyanzu)//嗯,吴彦祖。 .into( imageViewNoFade );
嗯,其实这个是默认的,可是你仍是能够写出来,渐显动画性能
Glide.with(context)
.load().placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.future_studio_launcher)
.crossFade()
.into(imageViewFade);
这里还有一个.fadeFade(int duration)
,设置动画时间。若是你不想要动画能够加上.dontAnimate()
动画
.resize(int ,int )
单位是像素,裁剪你的图片大小。其实Glide已经会自动根据你mageView裁剪照片来放在缓存中了。可是不想适应ImageView大小的时候,能够调用这个方法.override()
。ui
Glide.with(context) .load(image) .override(600, 200) .into(imageViewResize);
就是上名讲的.fitCenter
和.CenterCrop
缩略图有什么用就不说了,方正在一些条件下好处大大的,至关于一个动态的placeHolder。还有一种方法。.thumbnail()
方法的目的就是让用户先看到一个低解析度的图,点开后,再加载一个高解析度的图。
Glide. with( context ) .load(image) .thumbnail( 0.1f )//表示为原图的十分之一 .into( imageView2 );
当缩略图也须要经过网络加载所有解析度的时候。
private void loadImageThumbnailRequest() { DrawableRequestBuilder<String> thumbnailRequest = Glide.with( context ).load( eatFoodyImages[2] ); Glide.with( context ).load( UsageExampleGifAndVideos.gifUrl ).thumbnail( thumbnailRequest ).into( imageView3 ); }
要想性能好,怎能够不用缓存。缓存就是为了减小或者杜绝多的网络请求。为了不缓存,Glide用了内存缓存和‘外存缓存机制’,而且 提供了相应的方法,彻底封装,不须要处理细节。Glide会自动缓存到内存,除非调用. skipMemoryCache( true )
。尽管调用了这个,Glide仍是会缓存到外存,还有一种情形,就是有一张图片,可是这张图变化很是快,这个时候可能并不想缓存到外存中,就使用.diskCacheStrategy( DiskCacheStrategy.NONE )。
若是你两种都不须要,能够两个方法组合着一块儿使用。
Glide默认会缓存Image的不少个版本,好比原图,若是你的imageView大小的缓存。.diskCacheStrategy( )
有如下几种缓存策略:
Glide
.with( context ).load( image )
.diskCacheStrategy( DiskCacheStrategy.SOURCE )
.into( imageViewFile );
.request()
加载图片确定也是有前后顺序,Glide提供了.request()
这个方法,它接收如下几个参数:
上名全部的状况都是加载图片到ImageView中,可是并非全部的状况都是这样。
从上面的介绍,已经能够看出Glide内部封装了全部的细节,什么网络请求,什么缓存机制,当全部都就绪事后,自动切换回UI线程,更新ImageView。Targets就是Glide中的回调,当异步线程中全部的工做作完事后返回结果。说白了就是,当请求图片完成后,须要回调的方法。
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 );}
注意事项:
.with(context.getApplicationContext() ).
当你的Activity GG事后,请求仍是会继续,回调仍是会继续。若是传给.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 ); }
适用于想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 ); }}
这个下一篇再补充,有点点复杂。