您的位置:首页 > 移动开发 > Android开发

基于Glide4.0.0RC1 BitmapTransformation给图片加上各类圆角

2017-07-19 15:59 330 查看
/**

 * Email yy_cping@163.com

 * Edit androidStudio

 * desc : 将图片转化为给类的特殊圆角图片

 */

public class GlideRoundedCornersTransform extends BitmapTransformation {

    private float mRadius;

    private CornerType mCornerType;

    private static final int VERSION = 1;

    private static final String ID = BuildConfig.APPLICATION_ID+"GlideRoundedCornersTransform." + VERSION;

    private static final byte[] ID_BYTES = ID.getBytes(CHARSET);

    public enum CornerType {

        ALL,

        TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT,

        TOP, BOTTOM, LEFT, RIGHT,

        TOP_LEFT_BOTTOM_RIGHT,

        TOP_RIGHT_BOTTOM_LEFT,

        TOP_LEFT_TOP_RIGHT_BOTTOM_RIGHT,

        TOP_RIGHT_BOTTOM_RIGHT_BOTTOM_LEFT,

    }

    public GlideRoundedCornersTransform(float radius, CornerType cornerType) {

        super();

        mRadius = UiUtils.dp2px(radius);//dp ->px

        mCornerType = cornerType;

    }

    @Override

    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {

        return roundCrop(pool, toTransform);

    }

    private Bitmap roundCrop(BitmapPool pool, Bitmap source) {

        if (source == null) {

            return null;

        }

        int width = source.getWidth();

        int height = source.getHeight();

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

        Path path = new Path();

        drawRoundRect(canvas, paint, path, width, height);

        return result;

    }

    private void drawRoundRect(Canvas canvas, Paint paint, Path path, int width, int height) {

         float[] rids ;

        switch (mCornerType) {

            case ALL:

                rids = new float[]{mRadius,mRadius,mRadius,mRadius,mRadius,mRadius,mRadius,mRadius};

                drawPath(rids,canvas, paint, path, width, height);

                break;

            case TOP_LEFT:

                rids = new float[]{mRadius,mRadius,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f};

                drawPath(rids,canvas, paint, path, width, height);

                break;

            case TOP_RIGHT:

                rids  = new float[]{0.0f,0.0f,mRadius,mRadius,0.0f,0.0f,0.0f,0.0f};

                drawPath(rids,canvas, paint, path, width, height);

                break;

            case BOTTOM_RIGHT:

                rids  = new float[]{0.0f,0.0f,0.0f,0.0f,mRadius,mRadius,0.0f,0.0f};

                drawPath(rids,canvas,  paint, path, width, height);

                break;

            case BOTTOM_LEFT:

                rids  = new float[]{0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,mRadius,mRadius};

                drawPath(rids,canvas,  paint, path, width, height);

                break;

            case TOP:

                rids = new float[]{mRadius,mRadius,mRadius,mRadius,0.0f,0.0f,0.0f,0.0f};

                drawPath(rids,canvas,  paint,  path,width, height);

                break;

            case BOTTOM:

                rids  = new float[]{0.0f,0.0f,0.0f,0.0f,mRadius,mRadius,mRadius,mRadius};

                drawPath(rids,canvas,  paint, path, width, height);

                break;

            case LEFT:

                rids = new float[]{mRadius,mRadius,0.0f,0.0f,0.0f,0.0f,mRadius,mRadius};

                drawPath(rids,canvas,  paint, path, width, height);

                break;

            case RIGHT:

                rids  = new float[]{0.0f,0.0f,mRadius,mRadius,mRadius,mRadius,0.0f,0.0f};

                drawPath(rids,canvas,  paint, path, width, height);

                break;

            case TOP_LEFT_BOTTOM_RIGHT:

                rids  = new float[]{mRadius,mRadius,0.0f,0.0f,mRadius,mRadius,0.0f,0.0f};

                drawPath(rids,canvas,  paint, path, width, height);

                break;

            case TOP_RIGHT_BOTTOM_LEFT:

                rids  = new float[]{0.0f,0.0f,mRadius,mRadius,0.0f,0.0f,mRadius,mRadius};

                drawPath(rids,canvas,  paint, path, width, height);

                break;

            case TOP_LEFT_TOP_RIGHT_BOTTOM_RIGHT:

                rids  = new float[]{mRadius,mRadius,mRadius,mRadius,mRadius,mRadius,0.0f,0.0f};

                drawPath(rids,canvas,  paint, path, width, height);

                break;

            case TOP_RIGHT_BOTTOM_RIGHT_BOTTOM_LEFT:

                rids  = new float[]{0.0f,0.0f,mRadius,mRadius,mRadius,mRadius,mRadius,mRadius};

                drawPath(rids,canvas,  paint,  path,width, height);

                break;

            default:

                throw new RuntimeException("RoundedCorners type not belong to CornerType");

        }

    }

    /**@param rids 圆角的半径,依次为左上角xy半径,右上角,右下角,左下角*/

    private void drawPath(float[] rids,Canvas canvas,Paint paint,Path path, int width, int height) {

        path.addRoundRect(new RectF(0, 0, width, height), rids, Path.Direction.CW);

//        canvas.clipPath(path);

        canvas.drawPath(path,paint);

    }

    @Override

    public boolean equals(Object o) {

        return o instanceof GlideRoundedCornersTransform;

    }

    @Override

    public int hashCode() {

        return ID.hashCode();

    }

    @Override

    public void updateDiskCacheKey(MessageDigest messageDigest) {

        messageDigest.update(ID_BYTES);

    }
}

//glide4.00  加载图片 代码施加圆角代码

       RequestOptions requestOptions = new RequestOptions();

//        requestOptions.circleCrop();

//        requestOptions.optionalTransform(new CircleCrop());

//        requestOptions.optionalTransform(new RoundedCorners(100));

        requestOptions.optionalTransform(new GlideRoundedCornersTransform(100,

                GlideRoundedCornersTransform.CornerType.TOP_LEFT));

        Glide.with(this).load("https://gss3.bdstatic" +

                ".com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike116%2C5%2C5%2C116%2C38/sign" +

                "=b214b363d754564ef168ec6bd2b7f7e7/7e3e6709c93d70cfc087257df2dcd100baa12b45.jpg")

                .apply(requestOptions)

                .into(image);

由于glide4.00 裁剪圆形图片,官方已给出,就不需要自定义bitmapTransform了

<--!   以下给出效果图 !-->



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 移动开发