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


  • 相关阅读:
    控制语句
    (小程序)接收用户键盘输入
    运算符
    java doc形成注释文档
    linux中rz、sz命令,zip、unzip命令,sqlite3基本操作
    hash应用-加随机盐保存密码
    非对称/对称加密算法,hash算法
    自签名的应用--数字货币
    HTTPS原理
    Django中app的model相互引用问题
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7086841.html
Copyright © 2020-2023  润新知