Android 绘制圆形图片

    经常在项目中,会遇到使用圆形头像。然而图片往往不是圆形的,我们需要对图片进行处理,以达到圆形图片的效果。这里,我总结了一下常用的android圆形图片的绘制的方法。主要有以下几种方式:1.画布裁剪;2.Xfermode进行重叠;3使用着色器shader。下面我们将一个一个进行描述:

    第一种,画布裁剪:通过创建空白的Bitmap生成canvas画布,然后将画布进行裁剪成圆形,最后在画布上进行绘制。见代码:

 /**
     * 通过裁剪画布
     *
     * @param bitmap
     * @return
     */
    public static Bitmap clipDrawable(Bitmap bitmap) {
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        int min = Math.min(width, height);

        //通过新建一个Bitmap创建一个画布
        Bitmap bp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bp);

        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(Color.BLACK);
        //创建圆形路径,用于画布裁剪
        Path path = new Path();
        path.addCircle(min / 2, min / 2, min / 2, Path.Direction.CCW);
        canvas.clipPath(path);
        //在裁剪后的画布上进行绘制
        canvas.drawBitmap(bitmap, -width / 2 + min / 2, -height / 2 + min / 2, paint);
        return bp;
    }

    第二种,Xfermode:我们使用Xfermode的src_in模式,将原始图片和圆形进行重叠,得到重叠的圆形部分。

/**
     * 通过Xfermode
     *
     * @param bitmap
     * @return
     */
    public static Bitmap getCircleBitmap(Bitmap bitmap) {
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        int min = Math.min(width, height);

        //通过新建一个Bitmap创建一个画布
        Bitmap bp = Bitmap.createBitmap(min, min, Bitmap.Config.ARGB_8888);
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(Color.GRAY);
        Canvas canvas = new Canvas(bp);
        canvas.drawCircle(min / 2, min / 2, min / 2, paint);
        //设置模式为取重叠的部分
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
//        paint.setColorFilter(new LightingColorFilter(0xFFFFFF00, 0x00000000));
//        canvas.drawBitmap(bitmap, min / 2 - width / 2, min / 2 - height / 2, paint);
        canvas.drawBitmap(bitmap, null, new Rect(min / 2 - width / 2, min / 2 - height / 2, width / 2 + min / 2, height / 2 + min / 2), paint);
        return bp;
    }

    第三种,shader着色器:给画笔设置着色器,最后使用这个画笔绘制圆形。

 /**
     * 通过shader
     */

    public static Bitmap getShaderBitmap(Bitmap bitmap) {
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(Color.GRAY);
        //设置着色器
        paint.setShader(new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));

        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        int r = Math.min(width, height) / 2;
        Bitmap bp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bp);
        //在圆形中进行着色
        canvas.drawCircle(width/2, height/2, r, paint);
        return bp;
    }

    总体来说,绘制的方法大致如上所述,大家可以针对自己的需求进行修改。上面的代码写的demo,所以命名方面比较随意,请大家谅解。如果有什么错误的地方,请大家指正,不甚感激。


  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值