android glide设置图片四个角 弧度

这里主要规避的是 Imageview 设置centrcrop 属性后,在设置圆角 不生效的问题, 除了自定义组件外,还可以通过glide 加载图片的方式设置, 哎, 不说了,上核心代码, 自己看

圆图

package com.ss.glideimagedemo;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;

import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;

/**
 * description:glide转换圆图
 * Created by bss
 */
public class GlideCircleTrans extends BitmapTransformation {
    public GlideCircleTransUtils(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());
        // 子位图第一个像素在源位图的X坐标
        int x = (source.getWidth() - size) / 2;
        //子位图第一个像素在源位图的y坐标
        int y = (source.getHeight() - size) / 2;
        //创建新位图  source 源位图
        Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
        //返回一个正好匹配给定宽、高和配置的只包含透明像素的Bitmap
        // 如果BitmapPool中找不到这样的Bitmap,就返回null
        Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
        //当返回null 时,创建给定宽、高和配置的新位图
        if (result == null) {
            result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
        }
        //画图
        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        // 设置shader
        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();
    }
}

转换成圆角图片

package com.ss.glideimagedemo;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;

import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;

/**
 * description:glide转换圆角图片
 * Created by bss
 */
public class GlideRoundTrans extends BitmapTransformation {

    private static float radius = 0f;

    public GlideRoundTransUtils(Context context) {
        this(context, 4);
    }

    public GlideRoundTransUtils(Context context, int dp) {
        super(context);
        this.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
        // 如果BitmapPool中找不到这样的Bitmap,就返回null
        Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
        //当返回null 时,创建给定宽、高和配置的新位图
        if (result == null) {
            result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        // 设置shader
        paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
        //抗锯齿
        paint.setAntiAlias(true);
        //画矩形
        RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
        //绘制圆角矩形   (RectF对象,x方向上的圆角半径,y方向上的圆角半径,绘制时所使用的画笔)
        canvas.drawRoundRect(rectF, radius, radius, paint);
        return result;
    }

    @Override
    public String getId() {
        return getClass().getName() + Math.round(radius);
    }
}

指定角

package com.ss.glideimagedemo;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;

import static com.ss.glideimagedemo.GlideRoundCornersTransUtils.CornerType.ALL;
/**
 * description:glide对指定角加载圆角
 * Created by bss
 */

public class GlideRoundCornersTrans implements Transformation<Bitmap> {


    private BitmapPool mBitmapPool;
    private int             mRadius;
    private int             mDiameter;
    private CornerType mCornerType = ALL;


    public GlideRoundCornersTransUtils(Context context, int radius, CornerType type) {
        mBitmapPool = Glide.get(context).getBitmapPool();
        mCornerType = type;
        mRadius = radius;
        mDiameter = 2 * mRadius;
    }

    public enum CornerType {
        /** 所有角 */
        ALL,
        /** 左上 */
        LEFT_TOP,
        /** 左下 */
        LEFT_BOTTOM,
        /** 右上 */
        RIGHT_TOP,
        /** 右下 */
        RIGHT_BOTTOM,
        /** 左侧 */
        LEFT,
        /** 右侧 */
        RIGHT,
        /** 下侧 */
        BOTTOM,
        /** 上侧 */
        TOP,
    }

    @Override
    public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
        Bitmap source = resource.get();
        int    width  = source.getWidth();
        int    height = source.getHeight();
        Bitmap bitmap = mBitmapPool.get(width, height, Bitmap.Config.ARGB_8888);
        if (bitmap == null) {
            bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        }
        Canvas canvas = new Canvas(bitmap);
        Paint  paint  = new Paint();
        paint.setAntiAlias(true);
        paint.setShader(new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
        drawRoundRect(canvas, paint, width, height);
        return BitmapResource.obtain(bitmap, mBitmapPool);
    }

    private void drawRoundRect(Canvas canvas, Paint paint, float width, float height) {
        switch (mCornerType) {
            case LEFT_TOP:
                drawLeftTopCorner(canvas, paint, width, height);
                break;
            case LEFT_BOTTOM:
                drawLeftBottomCorner(canvas, paint, width, height);
                break;
            case RIGHT_TOP:
                drawRightTopCorner(canvas, paint, width, height);
                break;
            case RIGHT_BOTTOM:
                drawRightBottomCorner(canvas, paint, width, height);
                break;
            case LEFT:
                drawLeftCorner(canvas, paint, width, height);
                break;
            case RIGHT:
                drawRightCorner(canvas, paint, width, height);
                break;
            case BOTTOM:
                drawBottomCorner(canvas, paint, width, height);
                break;
            case TOP:
                drawTopCorner(canvas, paint, width, height);
                break;
            case ALL:
            default:
                canvas.drawRoundRect(new RectF(0, 0, width, height), mRadius, mRadius, paint);
                break;
        }
    }


    /**
     * 画左上角
     */
    private void drawLeftTopCorner(Canvas canvas, Paint paint, float width, float height) {
        canvas.drawRect(new RectF(mRadius, 0, width, height), paint);
        canvas.drawRect(new RectF(0, mRadius, mRadius, height), paint);
        canvas.drawArc(new RectF(0, 0, mDiameter, mDiameter), 180, 90, true, paint);
    }

    /**
     * 画左下角
     */
    private void drawLeftBottomCorner(Canvas canvas, Paint paint, float width, float height) {
        canvas.drawRect(new RectF(0, 0, width, height - mRadius), paint);
        canvas.drawRect(new RectF(mRadius, height - mRadius, width, height), paint);
        canvas.drawArc(new RectF(0, height - mDiameter, mDiameter, height), 90, 90, true, paint);
    }

    /**
     * 画右上角
     */
    private void drawRightTopCorner(Canvas canvas, Paint paint, float width, float height) {
        canvas.drawRect(new RectF(0, 0, width - mRadius, height), paint);
        canvas.drawRect(new RectF(width - mRadius, mRadius, width, height), paint);
        canvas.drawArc(new RectF(width - mDiameter, 0, width, mDiameter), 270, 90, true, paint);
    }

    /**
     * 画右下角
     */
    private void drawRightBottomCorner(Canvas canvas, Paint paint, float width, float height) {
        canvas.drawRect(new RectF(0, 0, width, height - mRadius), paint);
        canvas.drawRect(new RectF(0, height - mRadius, width - mRadius, height), paint);
        canvas.drawArc(new RectF(width - mDiameter, height - mDiameter, width, height), 0, 90, true, paint);
    }

    /**
     * 画左 角
     */
    private void drawLeftCorner(Canvas canvas, Paint paint, float width, float height) {
        canvas.drawRect(new RectF(mRadius, 0, width, height), paint);
        canvas.drawRect(new RectF(0, mRadius,  mRadius, height-mRadius), paint);
        canvas.drawArc(new RectF(0, 0, mDiameter, mDiameter), 180, 90, true, paint);
        canvas.drawArc(new RectF(0, height - mDiameter, mDiameter, height), 90, 90, true, paint);
    }

    /**
     * 画右角
     */
    private void drawRightCorner(Canvas canvas, Paint paint, float width, float height) {
        canvas.drawRect(new RectF(0, 0, width - mRadius, height), paint);
        canvas.drawRect(new RectF(width-mRadius, mRadius, width, height-mRadius), paint);
        canvas.drawArc(new RectF(width - mDiameter, 0, width, mDiameter), 270, 90, true, paint);
        canvas.drawArc(new RectF(width - mDiameter, height - mDiameter, width, height), 0, 90, true, paint);
    }

    /**
     * 画上 角
     */
    private void drawTopCorner(Canvas canvas, Paint paint, float width, float height) {
        canvas.drawRect(new RectF(0, mRadius, width, height), paint);
        canvas.drawRect(new RectF(mRadius, 0, width-mRadius, mRadius), paint);
        canvas.drawArc(new RectF(0, 0, mDiameter, mDiameter), 180, 90, true, paint);
        canvas.drawArc(new RectF(width - mDiameter, 0, width, mDiameter), 270, 90, true, paint);
    }

    /**
     * 画下 角
     */
    private void drawBottomCorner(Canvas canvas, Paint paint, float width, float height) {
        canvas.drawRect(new RectF(0, 0, width, height - mRadius), paint);
        canvas.drawRect(new RectF(mRadius, height-mRadius, width-mRadius, height), paint);
        canvas.drawArc(new RectF(0, height - mDiameter, mDiameter, height), 90, 90, true, paint);
        canvas.drawArc(new RectF(width - mDiameter, height - mDiameter, width, height), 0, 90, true, paint);
    }


    @Override
    public String getId() {
        return "RoundedTransformation(radius=" + mRadius + ", diameter=" + mDiameter + ")";
    }
}
package com.ss.glideimagedemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.widget.ImageView;

import com.bumptech.glide.Glide;

public class MainActivity extends AppCompatActivity {
    String imgurl = "http://app.jstyle.cn/jm_interface_1_2/upimage/1516861655266.jpg";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ImageView iv_circle = (ImageView) findViewById(R.id.iv_circle);
        ImageView iv_Round = (ImageView) findViewById(R.id.iv_Round);
        ImageView iv_Round1 = (ImageView) findViewById(R.id.iv_Round1);
        ImageView iv_Round2 = (ImageView) findViewById(R.id.iv_Round2);
        ImageView iv_Round3 = (ImageView) findViewById(R.id.iv_Round3);
        ImageView iv_Round4 = (ImageView) findViewById(R.id.iv_Round4);
        ImageView iv_Round5 = (ImageView) findViewById(R.id.iv_Round5);
        ImageView iv_Round6 = (ImageView) findViewById(R.id.iv_Round6);
        ImageView iv_Round7 = (ImageView) findViewById(R.id.iv_Round7);
        ImageView iv_Round8 = (ImageView) findViewById(R.id.iv_Round8);
        ImageView iv_Round9 = (ImageView) findViewById(R.id.iv_Round9);
        //加载圆图
        Glide.with(this).load(imgurl).transform(new GlideCircleTrans(this)).into(iv_circle);
        //加载圆角图片
        Glide.with(this).load(imgurl).transform(new GlideRoundTrans(this, 10)).into(iv_Round);
        //加载圆角图片全角
        Glide.with(this).load(imgurl).bitmapTransform( new GlideRoundCornersTrans(this,dip2px(25),GlideRoundCornersTransUtils.CornerType.ALL)).into(iv_Round1);
//加载圆角图片 上
        Glide.with(this).load(R.mipmap.pretty_1).bitmapTransform( new GlideRoundCornersTrans(this,dip2px(25),GlideRoundCornersTransUtils.CornerType.TOP)).into(iv_Round2);
//加载圆角图片 下
        Glide.with(this).load(R.mipmap.pretty_2).bitmapTransform( new GlideRoundCornersTrans(this,dip2px(25),GlideRoundCornersTransUtils.CornerType.BOTTOM)).into(iv_Round3);
//加载圆角图片 左
        Glide.with(this).load(R.mipmap.pretty_3).bitmapTransform( new GlideRoundCornersTrans(this,dip2px(25),GlideRoundCornersTransUtils.CornerType.LEFT)).into(iv_Round4);
//加载圆角图片 右
        Glide.with(this).load(R.mipmap.pretty_4).bitmapTransform( new GlideRoundCornersTrans(this,dip2px(25),GlideRoundCornersTransUtils.CornerType.RIGHT)).into(iv_Round5);
//加载圆角图片 左上
        Glide.with(this).load(R.mipmap.pretty_5).bitmapTransform( new GlideRoundCornersTrans(this,dip2px(25),GlideRoundCornersTransUtils.CornerType.LEFT_TOP)).into(iv_Round6);
//加载圆角图片 右上
        Glide.with(this).load(R.mipmap.pretty_6).bitmapTransform( new GlideRoundCornersTrans(this,dip2px(25),GlideRoundCornersTransUtils.CornerType.RIGHT_TOP)).into(iv_Round7);
//加载圆角图片 左下
        Glide.with(this).load(R.mipmap.pretty_7).bitmapTransform( new GlideRoundCornersTrans(this,dip2px(25),GlideRoundCornersTransUtils.CornerType.LEFT_BOTTOM)).into(iv_Round8);
//加载圆角图片 右下
        Glide.with(this).load(R.mipmap.pretty_8).bitmapTransform( new GlideRoundCornersTrans(this,dip2px(25),GlideRoundCornersTransUtils.CornerType.RIGHT_BOTTOM)).into(iv_Round9);


    }

    private int dip2px(float dpValue) {
        DisplayMetrics metrics = getResources().getDisplayMetrics();
        int px = (int) (dpValue * (metrics.densityDpi / 160f));
        return px;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值