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


  • 相关阅读:
    java-String类
    多线程的细节
    java-多线程的练习----妖,等待唤醒,代码重构,lock到condition
    javascript函数的声明和调用
    表单
    java-多线程的入门_进阶总结
    uboot命令
    u-boot移植 III
    u-boot移植 II
    汇编词典
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7086841.html
Copyright © 2011-2022 走看看