Android圆形以及圆角矩形头像

原理,通过设置画笔的Mode.SRC_IN将画布上重叠区域以外清除,圆形头像不就是我们的bitmap上在中心位置画一个圆然后两部分重叠的么。

如果不明白请往下看。

下面整张图是需要处理的bitmap,我们在其中心画了一个圆2,这样圆2和bitmap的重叠部分就是圆2.Mode.SRC_IN模式会将1和3部分清除掉。然后只剩下2区域。

2区域就是我们所要的头像。

Android圆形以及圆角矩形头像_第1张图片

先贴代码:

public Bitmap toCircleBitmap(Bitmap bitmap, int cr) {  

        //圆形图片宽高  
        int width = bitmap.getWidth();  
        int height = bitmap.getHeight();  
        //正方形的边长  
        int r = 0;  
        //取最短边做边长  
r=width > height?height/2: width/2;
        if(cr==0)cr=r;
        Bitmap backgroundBmp = Bitmap.createBitmap(2*r, 2*r, Config.ARGB_8888);  
        Canvas canvas = new Canvas(backgroundBmp);  
        Paint paint = new Paint();  
        //设置边缘光滑,去掉锯齿  
        paint.setAntiAlias(true);  
        //宽高相等,即正方形  
        Rect srcRect = new Rect(width/2-r, height/2-r, width/2+r,height/2+r);  
        Rect detRect = new Rect(0,0, 2*r,2*r); 
        //canvas.drawCircle(width/2, height/2, r, paint); 
        RectF rectx = new RectF(0, 0, 2*r, 2*r);  
        canvas.drawRoundRect(rectx, cr, cr, paint);  
        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));  
        canvas.drawBitmap(bitmap, srcRect, detRect, paint);  
        return backgroundBmp;  

    } 

1,这个函数返回的就是圆角矩形,参数bitmap是要转换的原始bitmap,cr是圆角矩形的四个圆角半径。如果cr设置为0就认为是圆形头像。

圆角矩形的四个圆角半径和正方形边长相等,那这个圆角矩形就是一个特殊的圆角矩形--圆。

2,r=width > height?height/2: width/2;取最小边的一般作为半径。

3, if(cr==0)cr=r;如果cr为0则认为要返回的是圆形。

4,Bitmap backgroundBmp = Bitmap.createBitmap(2*r, 2*r, Config.ARGB_8888);  创建要返回的bitmap.

5, paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 这个函数是将重叠部分以外部分去掉 。

6, canvas.drawRoundRect(rectx, cr, cr, paint); 画圆或者圆角矩阵。

7,canvas.drawBitmap(bitmap, srcRect, detRect, paint);  将bitmap中处于srcRect,的部分画在要返回的backgroundBmp的canvas的detRect位置。

这样canvas上就有两个图形,一个是这句话画的bitmap,一个是上面画的圆角矩阵。这两部分重叠部分就是我们要的头像。因为我们设置paint的模式为清除重叠部分以外部分,所以我们需要的头像以外的部分都是没有重叠的会被清除掉,只剩下我们需要的头像。

返回backgroundBmp即可。


你可能感兴趣的:(android,app)