• Glide加载圆形图片和圆角图片


    一、简介:

    介绍两种使用 BitmapTransformation 来实现 Glide 加载圆形图片和圆角图片的方法。Glide 并不能直接支持 Round Pictures ,需要使用 BitmapTransformation 来进行处理。

    二、网上的实现方式

    这里介绍下网上常见的方式和使用 RoundedBitmapDrawable 两种方法,本质上是差不多的:
    使用 Canvas 和 Paint 来绘制
    使用 Android.support.v4.graphics.drawable.RoundedBitmapDrawable
    PS: RoundedBitmapDrawable 是 support.v4 下的一个类,想了解更多,可以阅读我之前的文章:Android 必知必会-使用 supportV4 的 RoundedBitmapDrawable 实现圆角
    实现圆形图片:

    /**
     * 
     * Glide 圆形图片 Transform
     */
    
    public class GlideCircleTransform extends BitmapTransformation {
        public GlideCircleTransform(Context context) {
            super(context);
        }
    
        @Override
        protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
            return circleCrop(pool, toTransform);
        }
    
        private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
            if (source == null) return null;
            int size = Math.min(source.getWidth(), source.getHeight());
            int x = (source.getWidth() - size) / 2;
            int y = (source.getHeight() - size) / 2;
            Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
            Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
            if (result == null) {
                result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
            }
            Canvas canvas = new Canvas(result);
            Paint paint = new Paint();
            paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
            paint.setAntiAlias(true);
            float r = size / 2f;
            canvas.drawCircle(r, r, r, paint);
            return result;
        }
    
        @Override
        public String getId() {
            return getClass().getName();
        }
    }
    

    实现圆角图片:

    /**
     * Glide 圆角 Transform
     */
    
    public class GlideRoundTransform extends BitmapTransformation {
    
        private static float radius = 0f;
    
        /**
     * 构造函数 默认圆角半径 4dp
     *
     * @param context Context
     */
        public GlideRoundTransform(Context context) {
            this(context, 4);
        }
    
        /**
     * 构造函数
     *
     * @param context Context
     * @param dp 圆角半径
     */
        public GlideRoundTransform(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);
        }
    
        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);
        }
    }
    

    三、笔者比较喜欢的简便的实现方式

    //加载圆角图片
       //加载圆角图片
        public static void loadRoundImage(Context context, String url, final ImageView imageView) {
            Glide.with(context)
                    .load(url)
                    .placeholder(placeholder)
                    .error(placeholder)
                    //.centerCrop() 千万不要加,加了就没有圆角效果了
                    .transform(new CenterCrop(context), new GlideRoundTransform(context,10))
                    .into(imageView);
        }
    
    
        //加载圆形图片
        public static void loadCirclePic(final Context context, String url, final ImageView imageView) {
            Glide.with(context)
                    .load(url)
                    .asBitmap()
                    .placeholder(placeholder)
                    .error(placeholder)
                    .diskCacheStrategy(DiskCacheStrategy.ALL) //设置缓存
                    .into(new BitmapImageViewTarget(imageView) {
                        @Override
                        protected void setResource(Bitmap resource) {
                            RoundedBitmapDrawable circularBitmapDrawable =
                                    RoundedBitmapDrawableFactory.create(context.getResources(), resource);
                            circularBitmapDrawable.setCircular(true);
                            imageView.setImageDrawable(circularBitmapDrawable);
                        }
                    });
    
        }
    

    原因到底是什么呢? 其实主要问题是在 centerCrop()方法里面。
    看centerCrop()方法的源码可知,也是需要调用transform()方法的.所以前后共用CenterCrop会覆盖掉GlideRoundImage的效果:

    public BitmapRequestBuilder<ModelType, TranscodeType> centerCrop() {
            return transform(glide.getBitmapCenterCrop());
        }
    

    关于drawableToBitmap的源码的实现是这样的

    public static Bitmap drawableToBitmap(Drawable drawable) {
            // 取 drawable 的长宽
            int w = drawable.getIntrinsicWidth();
            int h = drawable.getIntrinsicHeight();
    
            // 取 drawable 的颜色格式
            Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
                    : Bitmap.Config.RGB_565;
            // 建立对应 bitmap
            Bitmap bitmap = Bitmap.createBitmap(w, h, config);
            // 建立对应 bitmap 的画布
            Canvas canvas = new Canvas(bitmap);
            drawable.setBounds(0, 0, w, h);
            // 把 drawable 内容画到画布中
            drawable.draw(canvas);
            return bitmap;
        }
    /**
     * RoundedBitmapDrawable 是 V4 下的一个类,不能简单的通过:强制转换成 BitmapDrawable
     * Bitmap bitmap = ((BitmapDrawable)xxx).getBitmap();
     */
    

    Glide加载圆形图片和圆角图片

  • 相关阅读:
    python 基础2.5 循环中continue与breake用法
    python 基础 2.4 while 循环
    python 基础 2.3 for 循环
    python 基础 2.2 if流程控制(二)
    python 基础 2.1 if 流程控制(一)
    python 基础 1.6 python 帮助信息及数据类型间相互转换
    python 基础 1.5 python数据类型(四)--字典常用方法示例
    Tornado Web 框架
    LinkCode 第k个排列
    LeetCode 46. Permutations
  • 原文地址:https://www.cnblogs.com/sishuiliuyun/p/15746681.html
Copyright © 2020-2023  润新知