美文网首页android适配工作生活
Glide输出指定位置圆角,解决ImageView设置scanT

Glide输出指定位置圆角,解决ImageView设置scanT

作者: 国内不知名程序员 | 来源:发表于2019-07-03 16:43 被阅读0次
    效果图 指定圆角(top_left_right).png

    项目有需求设置图片顶部是圆角,底部是直角的需求:

    在网上搜索了很久,终于找到一个比较完美的,在搜索过程中,发现有很多文章巴拉巴拉怼一大堆代码,复制到自己项目里面没法用,心里...

    代码(不是我写的,我不会,原原本本的搬运过来了):

    /**
     * glide 输出指定圆角
     */
    public class RoundedCornersTransformation extends BitmapTransformation {
    
        private static final int VERSION = 1;
        private static final String ID = "jp.wasabeef.glide.transformations.RoundedCornersTransformation." + VERSION;
    
        @Override
        protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {
            int width = toTransform.getWidth();
            int height = toTransform.getHeight();
    
            Bitmap bitmap = pool.get(width, height, Bitmap.Config.ARGB_8888);
            bitmap.setHasAlpha(true);
    
            Canvas canvas = new Canvas(bitmap);
            Paint paint = new Paint();
            paint.setAntiAlias(true);
            paint.setShader(new BitmapShader(toTransform, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
            drawRoundRect(canvas, paint, width, height);
            return bitmap;
        }
    
        /**
         * 圆角的类型
         */
        public enum CornerType {
            /**
             * 圆角的类型枚举
             */
            ALL,
            TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT,
            TOP, BOTTOM, LEFT, RIGHT,
            OTHER_TOP_LEFT, OTHER_TOP_RIGHT, OTHER_BOTTOM_LEFT, OTHER_BOTTOM_RIGHT,
            DIAGONAL_FROM_TOP_LEFT, DIAGONAL_FROM_TOP_RIGHT
        }
    
        private int radius;
        private int diameter;
        private int margin;
        private CornerType cornerType;
    
        public RoundedCornersTransformation(int radius, int margin) {
            this(radius, margin, CornerType.ALL);
        }
    
        /**
         * @param radius     圆角角度
         * @param margin     边距
         * @param cornerType 圆角的类型
         */
        public RoundedCornersTransformation(int radius, int margin, CornerType cornerType) {
            this.radius = radius;
            this.diameter = this.radius * 2;
            this.margin = margin;
            this.cornerType = cornerType;
        }
    
    
        private void drawRoundRect(Canvas canvas, Paint paint, float width, float height) {
            float right = width - margin;
            float bottom = height - margin;
    
            switch (cornerType) {
                case ALL:
                    canvas.drawRoundRect(new RectF(margin, margin, right, bottom), radius, radius, paint);
                    break;
                case TOP_LEFT:
                    drawTopLeftRoundRect(canvas, paint, right, bottom);
                    break;
                case TOP_RIGHT:
                    drawTopRightRoundRect(canvas, paint, right, bottom);
                    break;
                case BOTTOM_LEFT:
                    drawBottomLeftRoundRect(canvas, paint, right, bottom);
                    break;
                case BOTTOM_RIGHT:
                    drawBottomRightRoundRect(canvas, paint, right, bottom);
                    break;
                case TOP:
                    drawTopRoundRect(canvas, paint, right, bottom);
                    break;
                case BOTTOM:
                    drawBottomRoundRect(canvas, paint, right, bottom);
                    break;
                case LEFT:
                    drawLeftRoundRect(canvas, paint, right, bottom);
                    break;
                case RIGHT:
                    drawRightRoundRect(canvas, paint, right, bottom);
                    break;
                case OTHER_TOP_LEFT:
                    drawOtherTopLeftRoundRect(canvas, paint, right, bottom);
                    break;
                case OTHER_TOP_RIGHT:
                    drawOtherTopRightRoundRect(canvas, paint, right, bottom);
                    break;
                case OTHER_BOTTOM_LEFT:
                    drawOtherBottomLeftRoundRect(canvas, paint, right, bottom);
                    break;
                case OTHER_BOTTOM_RIGHT:
                    drawOtherBottomRightRoundRect(canvas, paint, right, bottom);
                    break;
                case DIAGONAL_FROM_TOP_LEFT:
                    drawDiagonalFromTopLeftRoundRect(canvas, paint, right, bottom);
                    break;
                case DIAGONAL_FROM_TOP_RIGHT:
                    drawDiagonalFromTopRightRoundRect(canvas, paint, right, bottom);
                    break;
                default:
                    canvas.drawRoundRect(new RectF(margin, margin, right, bottom), radius, radius, paint);
                    break;
            }
        }
    
        private void drawTopLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(margin, margin, margin + diameter, margin + diameter), radius,
                    radius, paint);
            canvas.drawRect(new RectF(margin, margin + radius, margin + radius, bottom), paint);
            canvas.drawRect(new RectF(margin + radius, margin, right, bottom), paint);
        }
    
        private void drawTopRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(right - diameter, margin, right, margin + diameter), radius,
                    radius, paint);
            canvas.drawRect(new RectF(margin, margin, right - radius, bottom), paint);
            canvas.drawRect(new RectF(right - radius, margin + radius, right, bottom), paint);
        }
    
        private void drawBottomLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(margin, bottom - diameter, margin + diameter, bottom), radius,
                    radius, paint);
            canvas.drawRect(new RectF(margin, margin, margin + diameter, bottom - radius), paint);
            canvas.drawRect(new RectF(margin + radius, margin, right, bottom), paint);
        }
    
        private void drawBottomRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(right - diameter, bottom - diameter, right, bottom), radius,
                    radius, paint);
            canvas.drawRect(new RectF(margin, margin, right - radius, bottom), paint);
            canvas.drawRect(new RectF(right - radius, margin, right, bottom - radius), paint);
        }
    
        private void drawTopRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(margin, margin, right, margin + diameter), radius, radius,
                    paint);
            canvas.drawRect(new RectF(margin, margin + radius, right, bottom), paint);
        }
    
        private void drawBottomRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(margin, bottom - diameter, right, bottom), radius, radius,
                    paint);
            canvas.drawRect(new RectF(margin, margin, right, bottom - radius), paint);
        }
    
        private void drawLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(margin, margin, margin + diameter, bottom), radius, radius,
                    paint);
            canvas.drawRect(new RectF(margin + radius, margin, right, bottom), paint);
        }
    
        private void drawRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(right - diameter, margin, right, bottom), radius, radius, paint);
            canvas.drawRect(new RectF(margin, margin, right - radius, bottom), paint);
        }
    
        private void drawOtherTopLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(margin, bottom - diameter, right, bottom), radius, radius,
                    paint);
            canvas.drawRoundRect(new RectF(right - diameter, margin, right, bottom), radius, radius, paint);
            canvas.drawRect(new RectF(margin, margin, right - radius, bottom - radius), paint);
        }
    
        private void drawOtherTopRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(margin, margin, margin + diameter, bottom), radius, radius,
                    paint);
            canvas.drawRoundRect(new RectF(margin, bottom - diameter, right, bottom), radius, radius,
                    paint);
            canvas.drawRect(new RectF(margin + radius, margin, right, bottom - radius), paint);
        }
    
        private void drawOtherBottomLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(margin, margin, right, margin + diameter), radius, radius,
                    paint);
            canvas.drawRoundRect(new RectF(right - diameter, margin, right, bottom), radius, radius, paint);
            canvas.drawRect(new RectF(margin, margin + radius, right - radius, bottom), paint);
        }
    
        private void drawOtherBottomRightRoundRect(Canvas canvas, Paint paint, float right,
                                                   float bottom) {
            canvas.drawRoundRect(new RectF(margin, margin, right, margin + diameter), radius, radius,
                    paint);
            canvas.drawRoundRect(new RectF(margin, margin, margin + diameter, bottom), radius, radius,
                    paint);
            canvas.drawRect(new RectF(margin + radius, margin + radius, right, bottom), paint);
        }
    
        private void drawDiagonalFromTopLeftRoundRect(Canvas canvas, Paint paint, float right,
                                                      float bottom) {
            canvas.drawRoundRect(new RectF(margin, margin, margin + diameter, margin + diameter), radius,
                    radius, paint);
            canvas.drawRoundRect(new RectF(right - diameter, bottom - diameter, right, bottom), radius,
                    radius, paint);
            canvas.drawRect(new RectF(margin, margin + radius, right - diameter, bottom), paint);
            canvas.drawRect(new RectF(margin + diameter, margin, right, bottom - radius), paint);
        }
    
        private void drawDiagonalFromTopRightRoundRect(Canvas canvas, Paint paint, float right,
                                                       float bottom) {
            canvas.drawRoundRect(new RectF(right - diameter, margin, right, margin + diameter), radius,
                    radius, paint);
            canvas.drawRoundRect(new RectF(margin, bottom - diameter, margin + diameter, bottom), radius,
                    radius, paint);
            canvas.drawRect(new RectF(margin, margin, right - radius, bottom - radius), paint);
            canvas.drawRect(new RectF(margin + radius, margin + radius, right, bottom), paint);
        }
    
        @Override
        public String toString() {
            return "RoundedTransformation(radius=" + radius + ", margin=" + margin + ", diameter="
                    + diameter + ", cornerType=" + cornerType.name() + ")";
        }
    
        @Override
        public boolean equals(Object o) {
            return o instanceof RoundedCornersTransformation &&
                    ((RoundedCornersTransformation) o).radius == radius &&
                    ((RoundedCornersTransformation) o).diameter == diameter &&
                    ((RoundedCornersTransformation) o).margin == margin &&
                    ((RoundedCornersTransformation) o).cornerType == cornerType;
        }
    
        @Override
        public int hashCode() {
            return ID.hashCode() + radius * 10000 + diameter * 1000 + margin * 100 + cornerType.ordinal() * 10;
        }
    
        @Override
        public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
            messageDigest.update((ID + radius + diameter + margin + cornerType).getBytes(CHARSET));
        }
    }
    

    使用:

      // 圆角图片 new RoundedCornersTransformation 参数为 :半径 , 外边距 , 圆角方向(ALL,BOTTOM,TOP,RIGHT,LEFT,BOTTOM_LEFT等等)
          //顶部左边圆角
            RoundedCornersTransformation transformation = new RoundedCornersTransformation
                    (20, 0, RoundedCornersTransformation.CornerType.TOP_LEFT);
          //顶部右边圆角 
           RoundedCornersTransformation transformation1 = new RoundedCornersTransformation
                    (20, 0, RoundedCornersTransformation.CornerType.TOP_RIGHT);
    
            //组合各种Transformation,
            MultiTransformation<android.graphics.Bitmap> mation = new MultiTransformation<>
             //Glide设置圆角图片后设置ImageVIew的scanType="centerCrop"无效解决办法,将new CenterCrop()添加至此                
               (new CenterCrop(), transformation, transformation1);
    
            Glide.with(context)
                    .load(R.drawable.temp2)
                    //切圆形
                    .apply(RequestOptions.bitmapTransform(mation))
                    .into(imageView);
    

    [友情链接]https://www.cnblogs.com/guanxinjing/p/9708581.html

    还有一个GitHub开源库,可以参考一下,也是在上面链接里面找到的,我就是在他开源库里面复制的代码,

    一个Android转换库,为Glide提供各种图像转换。(作者还有其他图片加载框架的转换库)
    [glide-transformations]https://github.com/wasabeef/glide-transformations

    为什么写这个文章:

    我自己在搜索的过程中,看到了很多链接,点开了好多个,都没法用。
    目的就是希望下一个遇到此问题的人,搜索的时候增加一点实用答案的几率;
    欢迎留言交流

    end

    相关文章

      网友评论

        本文标题:Glide输出指定位置圆角,解决ImageView设置scanT

        本文链接:https://www.haomeiwen.com/subject/lzcchctx.html