美文网首页
自定义View示例-03 圆形头像

自定义View示例-03 圆形头像

作者: 花椒人生 | 来源:发表于2018-12-01 01:06 被阅读0次

自定义View 简单实践-03 圆形头像

1.成品展示

image.png

呃,这头像有点大,不过,就这个意思了。。。。。。

2.思路分析

这里分两步走,第一,先取出Bitmap图片。第二,将领导Bitmap图片裁切出圆形来。第三,完工。

3.具体实现

3.1 取出Bitmap图片,绘制在固定大小矩形内

工具方法

getAvatar(Resources res,int width)
    public static Bitmap getAvatar(Resources res,int width){
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(res, R.drawable.avatar,options);
        options.inJustDecodeBounds = false;
        options.inDensity = options.outWidth;
        options.inTargetDensity = width;
        return BitmapFactory.decodeResource(res,R.drawable.avatar,options);
    }

设置 图片宽度WIDTH,和图片左上角PADDING

 private static final float WIDTH = DpToPxUtil.dp2px(200);
 private static final float PADDING = DpToPxUtil.dp2px(50);

//获取图片Bitmap
Bitmap bitmap = CMBitMapUtils.getAvatar(getResources(),(int) WIDTH);
 //在onDraw()方法中,绘制bitmap图片
canvas.drawBitmap(bitmap, PADDING, PADDING, paint);

3.1 需要用到Xfermode,将我们的bitmap取出圆形

关于Xfermode(自定义View paint 详解-1中 1.3有介绍

创建Xfermode
Xfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
image.png

裁剪

int saved = canvas.saveLayer(savedArea, paint);
canvas.drawOval(PADDING + EDGE_WIDTH, PADDING + EDGE_WIDTH, PADDING + WIDTH - EDGE_WIDTH, PADDING + WIDTH - EDGE_WIDTH, paint);
            paint.setXfermode(xfermode);
            canvas.drawBitmap(bitmap, PADDING, PADDING, paint);
            paint.setXfermode(null);
            canvas.restoreToCount(saved);

这里的savedArea 为固定大小的矩形

    savedArea.set(PADDING, PADDING, PADDING + WIDTH, PADDING + WIDTH);

这里需要注意的是,使用到了Xfermode,这里需要注意离屏缓冲。

成品


image.png

成品这里添加了一个黑边,这是在绘制圆形头像之前绘制了一个比圆形头像大一点的黑色圆形。

Demo:CMViewDemo Github地址

相关文章

网友评论

      本文标题:自定义View示例-03 圆形头像

      本文链接:https://www.haomeiwen.com/subject/rbxlcqtx.html