我们都知道手机加载图片是一个耗时又耗内存的事情,但因为效果我们又不得不加载各种各样的图片。但自己写的图片加载与缓存不仅代码繁琐,还会因为考虑不全造成各种各样未知的bug,所以越来越多的人利用第三方的框架来加载图片,而Glide在这方面可谓说独占鳌头。
选择Glide理由:
1.集成简单,一行代码依赖完成
2.使用简单,一行代码调用完成
3.能加载各种类型的图片,不管是静态图还是gif图
4.优秀的图片缓存技术,Glide运用了内存缓存(默认开启)和磁盘缓存两种缓存技术。
…
基于上面的优点,越来越多的人使用它,本文就教大家如何利用Glide去加载显示圆角图。按照国际惯例,先上效果图:
首先不用多说,添加依赖:
implementation 'com.github.bumptech.glide:glide:3.7.0'
接着因为是加载网络图,添加网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
接着就是重头戏了,自定义GlideRoundImage来继承BitmapTransformation来对我们的图片进行处理:
public class GlideRoundImage extends BitmapTransformation {
private static float radius = 0f;
public GlideRoundImage(Context context) {
this(context, 4);
}
public GlideRoundImage(Context context, int dp) {
super(context);
radius = Resources.getSystem().getDisplayMetrics().density * dp;
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
return roundCrop(pool, toTransform);
//Glide 4.0.0以上则使用下面的
//Bitmap bitmap = TransformationUtils.centerCrop(pool, toTransform, outWidth, outHeight);
//return roundCrop(pool, bitmap);
}
private static Bitmap roundCrop(BitmapPool pool, Bitmap source) {
if (source == null) {return null;}
Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
if (result == null) {
result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
paint.setAntiAlias(true);
RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
canvas.drawRoundRect(rectF, radius, radius, paint);
return result;
}
@Override
public String getId() {
return getClass().getName() + Math.round(radius);
}
}
然后就是添加一个布局来显示我们的图片了:
<ImageView
android:id="@+id/load_image"
android:layout_below="@+id/re_scenery_hot"
android:layout_width="match_parent"
android:layout_height="150dp"/>
</RelativeLayout>
最后就是调用了,由于我的代码是写在fragment里面的,所以需要传view,相信大家都能看懂:
/**
* 初始化布局
*
* @param mainLayout
*/
private void initView(View mainLayout) {
ImageView imageView = mainLayout.findViewById(R.id.load_image);
Glide.with(context)
.load("https://lvchen.coding.net/p/tupianyun/git/raw/master/image10.jpg")
.transform(new GlideRoundImage(context,30))
.into(imageView);
}
现在我们来运行起来:
是不是感觉有些不对劲,总感觉显示的有些问题。我们可以看布局里面横轴是match_parent,但显示出来怎么没有铺满呢。这是因为我们在调用.transform(new GlideRoundImage(context,30))方法的时候,把拉伸给覆盖了,倒是拉伸不起作用了。怎么解决呢,既然在调用transform时会自动覆盖拉伸,那么我们在调用transform是把自动拉伸再传进去即可。我们只需要修改下前面的加载代码,如下transform里面新加了拉伸参数new CenterCrop(context):
Glide.with(context)
.load("https://lvchen.coding.net/p/tupianyun/git/raw/master/image10.jpg")
.transform(new CenterCrop(context),new GlideRoundImage(context,30))
.into(imageView);
然后运行程序,我们再来看看效果:
怎么样,达到预期的效果了吧。圆角大小我们可以自己设置,0就是直角,数字越大,圆角越大。