Android圆形以及圆角矩形头像

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

如果不明白请往下看。

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

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


先贴代码:

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即可。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可生成圆形、方形、及方形的组合头像。项目地址:https://github.com/Pedroafa/avatar-android 效果图:如何使用:首先创建个ImageView<ImageView             android:id="@ id/roundedAvatar"             android:layout_height="fill_parent"             android:layout_width="fill_parent"/>2. //通过AvatarDrawableFactory生成各种形状的Drawable AvatarDrawableFactory avatarDrawableFactory = new AvatarDrawableFactory(getResources()); BitmapFactory.Options options = new BitmapFactory.Options(); options.inMutable = false; Bitmap avatar = BitmapFactory.decodeResource(getResources(), R.drawable.avatar, options); //圆形的 Drawable roundedAvatarDrawable = avatarDrawableFactory.getRoundedAvatarDrawable(avatar);//生成圆形的Drawable ImageView roundedAvatarView = (ImageView)rootView.findViewById(R.id.roundedAvatar); roundedAvatarView.setImageDrawable(roundedAvatarDrawable);其他形状的://圆形的且带边框的 Drawable borderedRoundedAvatarDrawable = avatarDrawableFactory.getBorderedRoundedAvatarDrawable(avatar); ImageView borderedRoundedAvatarView = (ImageView)rootView.findViewById(R.id.borderedRoundedAvatar); borderedRoundedAvatarView.setImageDrawable(borderedRoundedAvatarDrawable); //方形的 Drawable squaredAvatarDrawable = avatarDrawableFactory.getSquaredAvatarDrawable(avatar); ImageView squaredAvatarView = (ImageView)rootView.findViewById(R.id.squaredAvatar); squaredAvatarView.setImageDrawable(squaredAvatarDrawable); //俩个方形的组合头像 Drawable doubleSquaredAvatarDrawable = avatarDrawableFactory.getSquaredAvatarDrawable(avatar, avatar); ImageView doubleSquaredAvatarView = (ImageView)rootView.findViewById(R.id.doubleSquaredAvatar); doubleSquaredAvatarView.setImageDrawable(doubleSquaredAvatarDrawable); //三个方形的组合头像 Drawable tripleSquaredAvatarDrawable = avatarDrawableFactory.getSquaredAvatarDrawable(avatar, avatar, avatar); ImageView tripleSquaredAvatarView = (ImageView)rootView.findViewById(R.id.tripleSquaredAvatar); tripleSquaredAvatarView.setImageDrawable(tripleSquaredAvatarDrawable); //四个方形的组合头像 Drawable quadrupleSquaredAvatarDrawable = avatarDrawableFactory                     .getSquaredAvatarDrawable(avatar, avatar, avatar, avatar); ImageView quadrupleSquaredAvatarView = (ImageView)rootView.findViewById(R.id.quadrupleSquaredAvatar); quadrupleSquaredAvatarView.setImageDrawable(quadrupleSquaredAvatarDrawable);

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值