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,所以命名方面比較任意,请大家谅解。假设有什么错误的地方,请大家指正,不甚感激。


原文地址:https://www.cnblogs.com/claireyuancy/p/7086841.html