Android圆形图/头像

感觉也没什么好说的,直接上代码,都有注释,应该能看得懂吧,自己也在这里记录一下!

主要是对Paint Xfermode的运用:

/**
	 * 创建圆形头像
	 * 
	 * @param img
	 * @return
	 */
	public static Bitmap createRoundIcon(Bitmap img) {
		if (img == null) {
			return null;
		}
		// 原图大小
		int imgWidth = img.getWidth();
		int imgHeight = img.getHeight();
		// 生成圆形图像大小
		int imgSize = Math.min(imgWidth, imgHeight);
		// 绘制图片的起始位置
		float left = (imgSize - imgWidth) / 2.0F;
		float right = (imgSize - imgHeight) / 2.0F;
		// 填充边距
		int padding = 2;
		// 图像半径
		int r = imgSize / 2;

		// 1.创建新图
		Bitmap ret = Bitmap.createBitmap(imgSize, imgSize, Config.ARGB_8888);
		Canvas c = new Canvas(ret);
		Paint p = new Paint();
		p.setAntiAlias(true);

		// 2.绘制圆形头像
		p.setColor(Color.WHITE);
		c.drawCircle(r, r, r - padding, p);
		p.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
		c.drawBitmap(img, left, right, p);

		// 3.绘制边框
		p.setXfermode(new PorterDuffXfermode(Mode.DST_OVER));
		c.drawCircle(r, r, r, p);

		return ret;
	}


==========================================================================

增加几种生成圆形图片的方法:

主要是对ShapeDrawable,BitmapShader的运用:

	/**
	 * 生成圆形图片<BR>
	 * 如果图片大于或小于size,通过缩放源图到size大小,并生成圆形图片
	 * @param bitmap 源图
	 * @param size 生成图片大小
	 * @return 返回圆形图片
	 */
	public Bitmap createRoundBitmapByScale(Bitmap bitmap, int size) {
		if (bitmap == null) {
			return null;
		}
		
		Bitmap src = Bitmap.createScaledBitmap(bitmap, size, size, true);

		return createRoundBitmap(src, size);
	}
	
	/**
	 * 生成圆形图片<BR>
	 * 如果图片大于size,通过截取源图中心部分size大小,并生成圆形图片<BR>
	 * 如果图片小于size,通过创建一张size大小的图片将源图画在其中心位置,并生成图形图片
	 * @param bitmap 源图
	 * @param size 生成图片大小
	 * @return 返回圆形图片
	 */
	public Bitmap createRoundBitmapByClip(Bitmap bitmap, int size) {
		if (bitmap == null) {
			return null;
		}

		Bitmap src = null;
		int imgW = bitmap.getWidth();
		int imgH = bitmap.getHeight();
		int x = (imgW - size) / 2;
		int y = (imgH - size) / 2;
		if (x < 0 || y < 0) {// too small
			src = Bitmap.createBitmap(size, size, Config.ARGB_8888);
			Canvas c = new Canvas(src);
			c.drawBitmap(bitmap, -x, -y, new Paint(Paint.ANTI_ALIAS_FLAG));
		} else {
			src = Bitmap.createBitmap(bitmap, x, y, size, size);
		}

		return createRoundBitmap(src, size);
	}
	
	/**
	 * 生成圆形图片<BR>
	 * 原理:<BR>
	 * 1.生成size大小的圆形图片<BR>
	 * 2.从左上角绘制源图<BR>
	 * 结果:<BR>
	 * 如果图片大于size,取图片的左上部分生成圆形图片<BR>
	 * 如果图片小于size,生成圆形图片只占居左上部分
	 * @param bitmap 源图
	 * @param size 生成图片大小
	 * @return 返回圆形图片
	 */
	public Bitmap createRoundBitmap(Bitmap bitmap, int size) {
		if (bitmap == null) {
			return null;
		}
		// create round drawable
		ShapeDrawable sd = new ShapeDrawable(new OvalShape());
		sd.setBounds(0, 0, size, size);
		Paint p = sd.getPaint();
		p.setShader(new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP));
		// draw to bitmap
		Bitmap ret = Bitmap.createBitmap(size, size, Config.ARGB_8888);
		Canvas c = new Canvas(ret);
		sd.draw(c);

		return ret;
	}

补充:

也可以使用support.v4中的 RoundedBitmapDrawable:

RoundedBitmapDrawable dw = RoundedBitmapDrawableFactory.create(getResources(), 图片);
dw.setCornerRadius(圆形图片半径);
dw.setBounds(0, 0, 圆形图片大小, 圆形图片大小);
dw.draw(c);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值