Android Glide加载并显示圆角图片

我们都知道手机加载图片是一个耗时又耗内存的事情,但因为效果我们又不得不加载各种各样的图片。但自己写的图片加载与缓存不仅代码繁琐,还会因为考虑不全造成各种各样未知的bug,所以越来越多的人利用第三方的框架来加载图片,而Glide在这方面可谓说独占鳌头。
选择Glide理由:
1.集成简单,一行代码依赖完成
2.使用简单,一行代码调用完成
3.能加载各种类型的图片,不管是静态图还是gif图
4.优秀的图片缓存技术,Glide运用了内存缓存(默认开启)和磁盘缓存两种缓存技术。

基于上面的优点,越来越多的人使用它,本文就教大家如何利用Glide去加载显示圆角图。按照国际惯例,先上效果图:
Android Glide加载并显示圆角图片_第1张图片
首先不用多说,添加依赖:

 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);


    }

现在我们来运行起来:
Android Glide加载并显示圆角图片_第2张图片
是不是感觉有些不对劲,总感觉显示的有些问题。我们可以看布局里面横轴是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);

然后运行程序,我们再来看看效果:
Android Glide加载并显示圆角图片_第3张图片
怎么样,达到预期的效果了吧。圆角大小我们可以自己设置,0就是直角,数字越大,圆角越大。

你可能感兴趣的:(Android)