android圆形图像

在网上找了一下,最简单的是利用canvas的setXfermode,来控制图片重合部分的显示策略。

图片混合时,先画的是dst,后画的是src,各种混合的方式如下,其中圆形是dst,正方形是src:


 

不过网上的一些做法没有考虑到图片为长方形的情况,下面给出我修正后的做法:

这里我们采用srcin模式,先画透明的圆形即dst,再画原图即src,两个重叠的部分就是我们需要的圆形图了(dstin也可以,就是先画原图,再画透明的圆形)。

就是先判断宽和高中最大max、最小min,只创建半径为min的透明圆,然后画原图时移到中心去,只画一部分。

  public static Bitmap toCircleBitmap(Bitmap bitmap) {

        int min = bitmap.getWidth() > bitmap.getHeight() ? bitmap.getHeight() : bitmap.getWidth();
        int max = bitmap.getWidth() > bitmap.getHeight() ? bitmap.getWidth() : bitmap.getHeight();

        Bitmap output = Bitmap.createBitmap(min, min, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(output);
        Paint paint = new Paint();

        RectF rectF = new RectF(0, 0, min, min);
        canvas.drawOval(rectF, paint);

        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

        if (min == bitmap.getWidth()) {
            canvas.drawBitmap(bitmap, 0, (min - max) / 2, paint);
        } else {
            canvas.drawBitmap(bitmap, (min - max) / 2, 0, paint);
        }
        return output;
    }

对于画圆角,可以用drawRoundRect(rectF, 15, 15, paint);  替代drawOval。

原文地址:https://www.cnblogs.com/xdao/p/android_circle_image.html