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


  • 相关阅读:
    UVA 10462 Is There A Second Way Left?(次小生成树&Prim&Kruskal)题解
    POJ 1679 The Unique MST (次小生成树)题解
    POJ 2373 Dividing the Path (单调队列优化DP)题解
    BZOJ 2709 迷宫花园
    BZOJ 1270 雷涛的小猫
    BZOJ 2834 回家的路
    BZOJ 2506 calc
    BZOJ 3124 直径
    BZOJ 4416 阶乘字符串
    BZOJ 3930 选数
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7086841.html
Copyright © 2011-2022 走看看