Glide的初次使用
大部分内容借鉴于:https://mrfu.me/2016/02/28/Glide_Exceptions-_Debugging_and_Error_Handling/
一.在Android studio中配置
`compile 'com.github.bumptech.glide:glide:3.6.1'`
二.加载图片资源
1.从Android资源中加载
2.从文件中加载
3.从Uri中加载
代码如下:
//从各种途径获取图片
public void loadImageView(){
//资源id
Glide.with(this).load(resourceId).into(ivPic);
//文件
File file = new File("/storage/emulated/0/Download", "a.jpg");
Glide.with(this).load(file).into(ivPic);
//uri
Uri uri = resourceIdToUri(this, R.drawable.a);
Glide.with(this).load(uri).into(ivPic);
}
public static final String ANDROID_RESOURCE = "android.resource://";
public static final String FOREWARD_SLASH = "/";
private static Uri resourceIdToUri(Context context, int resourceId) {
return Uri.parse(ANDROID_RESOURCE + context.getPackageName() + FOREWARD_SLASH + resourceId);
}
三.在listview或者gridview中使用
Glide .with(context) .load(imageUrls[position]) .into((ImageView) convertView);
处理方式没有变化。
四.占位符和渐变动画
1.占位符(默认显示图片)
placeholder(R.mipmap.ic_launcher)
2.错误占位符(当网址错误,或其他原因显示不出来图片时)
.error(R.mipmap.future_studio_launcher)
3.渐变动画(淡入淡出效果,默认是300毫秒,当然后边会有自定义动画)
crossFade()
crossFade(int durtion)
4.不想要任何动画效果(请确保有更好的理由不要动画)
dontAnimate()
五.图片重设大小与缩放
1.重设图片大小
dontAnimate()
2缩放图像(两种模式)
(1)CenterCrop()是一个裁剪技术,即缩放图像让它填充到 ImageView 界限内并且裁剪额外的部分。ImageView 可能会完全填充,但图像可能不会完整显示。
(2)fitCenter() 是裁剪技术,即缩放图像让图像都测量出来等于或小于 ImageView 的边界范围。该图像将会完全显示,但可能不会填满整个 ImageView。
六.显示Gif和Video
1.gif检查(如果发现网址不是一个gif,会调用error())
asGif()
2.Gif转为Bitmap
asBitmap()
3.显示本地视频
String ilePath = "/storage/emulated/0/Pictures/example_video.mp4"; Glide .with( context ) .load( Uri.fromFile( new File( filePath ) ) ) .into( imageViewGifAsBitmap );
七.缓存基础
1.内存缓存(默认缓存到磁盘,不影响我们再次进入应用从磁盘中拿图片)
skipMemoryCache( true )
2.跳过磁盘缓存
diskCacheStrategy( DiskCacheStrategy.NONE )
他共有四种模式
DiskCacheStrategy.NONE 什么都不缓存,就像刚讨论的那样
DiskCacheStrategy.SOURCE 仅仅只缓存原来的全分辨率的图像。在我们上面的例子中,将会只有一个 1000x1000 像素的图片
DiskCacheStrategy.RESULT 仅仅缓存最终的图像,即,降低分辨率后的(或者是转换后的)
DiskCacheStrategy.ALL 缓存所有版本的图像(默认行为)
八.图片请求的优先级
priority(Priority.LOW)
(只是建议,和广播传递差不多)共有四个枚举类型
Priority.LOW
Priority.NORMAL
Priority.HIGH
Priority.IMMEDIATE
九.缩略图
1.简单缩略图
thumbnail( 0.1f )
2.新建请求拿到缩略图
// 再开一个请求去加载缩略图
private DrawableRequestBuilder<String> thumbnailRequest;
private void loadImageThumbnailRequest() {
// setup Glide request without the into() method
Hospital hospital = (Hospital) lists.get(lists.size() - 3);
thumbnailRequest = Glide.with(context).load(hospital.getPicId());
}
十.回调:SimpleTarget 和 ViewTarget 用于自定义视图类
1.当我们需要bitmap对象时。(还需要添加一句.asBitmap())
// 变成bitmap对象,可以指定大小,默认和imageview大小一致
SimpleTarget target = new SimpleTarget<Bitmap>(250,500) {
@Override
public void onResourceReady(Bitmap bitmap,
GlideAnimation glideAnimation) {
// do something with the bitmap
// for demonstration purposes, let's just set it to an ImageView
viewHolder.imageView.setImageBitmap(bitmap);
}
};
2.当我们的图片加载不只是在activity中出现的话。
context.getApplicationContext()可能更加安全
3.使用ViewTarget将图片放置进自定义控件中
//将图片传到自定义布局中
@SuppressWarnings("unchecked")
private void loadImageViewTarget() {
MyCustomView customView = (MyCustomView) findViewById( R.id.custom_view );
ViewTarget<MyCustomView, GlideDrawable> viewTarget = new ViewTarget<MyCustomView, GlideDrawable>( customView ) {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
this.view.setImage( resource.getCurrent() );
}
};
Glide
.with( this.getApplicationContext() ) // safer!
.load( eatFoodyImages[0] )
.into( viewTarget );
}
十一.加载图片到通知栏和应用小部件中
1.。。//自定义通知
@SuppressLint(“NewApi”)
public void startNotification(){
final RemoteViews rv = new RemoteViews(this.getPackageName(), R.layout.remote_notification);
rv.setImageViewResource(R.id.remoteview_notification_icon, R.drawable.a);
rv.setTextViewText(R.id.remoteview_notification_headline, "Title");
rv.setTextViewText(R.id.remoteview_notification_short_message, "content");
// build notification
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("Content Title")
.setContentText("Content Text")
.setContent(rv)
.setPriority( NotificationCompat.PRIORITY_MIN);
final Notification notification = mBuilder.build();
// set big content view for newer androids
if (android.os.Build.VERSION.SDK_INT >= 16) {
notification.bigContentView = rv;
}
NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(0, notification);
notificationTarget = new NotificationTarget(
this,
rv,
R.id.remoteview_notification_icon,
notification,
0);
}
2.。。。//自定义桌面小控件
三个xml,一个class
public class FSAppWidgetProvider extends AppWidgetProvider {
private AppWidgetTarget appWidgetTarget;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.custom_layout);
appWidgetTarget = new AppWidgetTarget( context, rv, R.id.custom_view, appWidgetIds );
Glide
.with( context.getApplicationContext() ) // safer!
.load( MainActivity.eatFoodyImages[3] )
.asBitmap()
.into( appWidgetTarget );
pushWidgetUpdate(context, rv);
}
public static void pushWidgetUpdate(Context context, RemoteViews rv) {
ComponentName myWidget = new ComponentName(context, FSAppWidgetProvider.class);
AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(myWidget, rv);
}
}