打造微信圆形头像更换

       很多都会发现微信的头像不是圆形,而今天我将浅谈一下,如何实现圆形头像。QQ5.0以后的版本就是圆形头像了而微信不是。当然了实现圆形头像的方法有很多种,可以使用开源的库,可以去写一个自定义的控件,或者去使用PS把它扣成一个圆形,但是这个方法显然不可取,不可能每个用户都是上传裁剪过后的圆形头像。那么今天我将讲解一种利用代码来裁剪一个圆形头像。另一方面也是为了让自己以后复习参考方便。

      实现思想如下:

我们实现一个圆形头像的更换肯定主要分为两步:第一要去调用系统的相册,第二拿到照片返回页面设置图片资源及获取到的图片进行圆形的裁剪。

一、调用系统的相册:

首先,通过Intent对象跳到相册Intent.ACTION_PICK,URI为操作的数据的相对路径

Intent intent =new Intent(Intent.ACTION_PICK,Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 0);//选择了图片会返回一个结果,0是requestCode请求码

然后会返回一个结果,所以需要用onActivityResult方法去接收返回的结果,重写onActivityResult方法

//重写onActivityResult方法获取返回的数据
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
//通过前面设置的requestCode为0,然后标示接受哪些数据
super.onActivityResult(requestCode, resultCode, data);
switch (resultCode) {
case RESULT_OK:
Uri uri =data.getData();//拿到路径从而拿到数据
String [] filePath={MediaStore.Images.Media.DATA};//拿到图片的路径
//在Android通过游标(相当于指针)来操作数据
Cursor query=getContentResolver().query(//内容接收者去拿内容发送者那去拿
uri,
filePath, //返回的数据
null,
null,
null);
query.moveToFirst();
int columnIndex=query.getColumnIndex(filePath[0]);
String imagePath=query.getString(columnIndex);//路径拿到
query.close();//游标关闭
Bitmap decodBitmap=BitmapFactory.decodeFile(imagePath);//获取到系统相册中的图片的路径则就可以转化成一个bitmap对象,就可以给Imageview设置一个一张图片。
headerView.setImageBitmap(createCicleImage(decodBitmap));
break;
default:
break;
}
}

获取图片以后就是要将我们获取到的图片裁剪成一个圆形的头像。

二、将图片裁剪成一个圆形的头像:

在裁剪头像前我们需要分析明确几点,在我们所有中的图片尺寸就只有三种,第一,高度小于宽度(理解为水平方向长);第二,高度大于宽度(竖直方向长);第三就是相等,这就是我们想要的,所以我们只考虑前面两种。针对前面两种分别给出示意图讲解裁剪的原理。

1 高度小于宽度:

打造微信圆形头像更换_第1张图片

2、高度大于宽度

打造微信圆形头像更换_第2张图片

接下来就是实现的具体代码:

@Override
	//重写onActivityResult方法获取返回的数据
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		//通过前面设置的requestCode为0,然后标示接受哪些数据
		super.onActivityResult(requestCode, resultCode, data);
		switch (resultCode) {
		case RESULT_OK:
			Uri uri =data.getData();//拿到路径从而拿到数据
			String [] filePath={MediaStore.Images.Media.DATA};//拿到图片的路径
			//在Android通过游标(相当于指针)来操作数据
			Cursor	query=getContentResolver().query(//内容接收者去拿内容发送者那去拿
					uri,
					filePath, //返回的数据
					null,
					null,
					null);
			query.moveToFirst();
			int columnIndex=query.getColumnIndex(filePath[0]);
			String imagePath=query.getString(columnIndex);//路径拿到
			query.close();//游标关闭
			Bitmap decodBitmap=BitmapFactory.decodeFile(imagePath);
			headerView.setImageBitmap(createCicleImage(decodBitmap));
			break;
		default:
			break;
		}

	}
	/**
	 * @author zhongqihong
	 * 将头像裁剪成圆形
	 * */
	private Bitmap createCicleImage(Bitmap bt){
		int height=bt.getHeight();
		int width=bt.getWidth();
		int left,top,bottom,right;//绘制图片区域的坐标,也即是将原图片切成正方形的图片的坐标,以原图片的左上角作为原点
		int dst_left,dst_top,dst_bottom,dst_right;//绘制在屏幕上的图片的位置的坐标,也即是在切好的正方形的原图上,并以切好的正方形图的左上角作为原点
		int RoundX;//半径的坐标
		if (height>=width) {
			//用canvas画圆形,取小的做直径,此时高度大于宽度就是一张竖直方向的图片
			RoundX=width/2;
			top=0;
			left=0;
			bottom=width;
			right=width;
			dst_left=0;
			dst_top=0;
			dst_bottom=width;
			dst_right=width;
		}else{
			RoundX=height/2;
			int filp=(width-height)/2;
			left=filp;
			right=filp+height;
			top=0;
			bottom=height;
			dst_bottom=height;
			dst_right=height;
			dst_left=0;
			dst_top=0;
		}
		Bitmap createBitmap=Bitmap.createBitmap(width,height,Config.ARGB_8888);
		Canvas canvas=new Canvas(createBitmap);//在画布填充这张图片
		canvas.drawARGB(0, 0, 0, 0);//第一个a就是透明度,其他为三原色
		Paint paint=new Paint();//new 一个画笔
		paint.setAntiAlias(true);//设置抗锯齿的
		int color=0xff424242;
		paint.setColor(color);
		Rect r= new Rect(dst_left, dst_top, dst_right, dst_bottom);//设置四个点的坐标,也即就是绘制一个正方形区域,然后再把原图覆盖到正方形区域中,在正方形区域范围内的图像就显示,不在的就不显示,那样就好像将图片裁剪成一个正方形的图片,原图片中切出正方形四个点所在的坐标
		Rect image_r=new Rect(left, top, right, bottom);//在切好的正方形图片上的四个点的坐标,并在该坐标轴中设置绘制圆形的图片的中心坐标,制定图片的圆形区域
		RectF rect=new RectF(r);
		canvas.drawRoundRect(rect, RoundX, RoundX, paint);//把图片绘制在屏幕的位置,rx,ry绘制的中心点
		paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.SRC_IN));//这行代码很重要
		canvas.drawBitmap(bt, image_r, r, paint);//绘制图片
		return createBitmap;
	}

最后就是运行结果:


打造微信圆形头像更换_第3张图片


你可能感兴趣的:(Android_项目Demo)