关闭

打造微信圆形头像更换

标签: 圆形头像Android圆形头像头像的更换调用系统相册
5500人阅读 评论(0) 收藏 举报
分类:

       很多都会发现微信的头像不是圆形,而今天我将浅谈一下,如何实现圆形头像。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 高度小于宽度:


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;
	}

最后就是运行结果:




1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:221459次
    • 积分:2787
    • 等级:
    • 排名:第12905名
    • 原创:74篇
    • 转载:1篇
    • 译文:0篇
    • 评论:144条
    欢迎一起搞事情

    由于个人私事问题,把CSDN博客搁置了很久了。发现有很多小伙伴在博客留言了很多问题,以及很多小伙伴私信我,我也没有来得及看。所以感到非常抱歉。因为曾想到自己遇到问题求助他人不成功的痛苦,所以决定开个QQ搞事情交流群,里面会一一回复博客和私信中的问题,会包括百度地图的SDK的开发和每途嗅嗅APP源码的问题。

    感谢持续关注,后期文章会慢慢补回来,我又回来了,欢迎一起搞事情.QQ交流群:621387914


    我的第一个上线的APP
    每途嗅嗅APP
    谢谢大家多多支持!
    博客专栏
    最新评论