[Android]自定义圆形图片

废话不多说,我们来看看效果吧:

原图:         效果图:

大概效果就是这样了,其中的功能包括:

1、将图片形成centerCrop的方式显示在ImageView中,图片缩放居中,对称截取。

2、以ImageView最小边为直径画圆,对图片进行截取。


在最开始的时候,由于项目需要制作圆形头像,于是也去网上百度一下源码看看,但是,感觉都是好高级的样子,难看明白,后来学习了一下,将里面的功能剖析出来,其实也是很简单的。

首先,我们先来看看最初的时候,我们是如何学习画圆形的:

	@Override
	protected void onDraw(Canvas canvas) {
		// 创建画笔
		Paint mPaint = new Paint();
		mPaint.setColor(Color.GRAY);// 设置灰色
		mPaint.setAntiAlias(true);// 设置画笔的锯齿效果。
		canvas.drawCircle(100, 100, 80, mPaint);// 画圆
	}

由上面的代码便可以画出下面的圆,是不是感觉很简单呢。(- -!呃,先别喷,图片画圆也是一样的原理)


在上面的图中,我们只是画一个纯色的圆,因此只需要一种色彩即可,但是,假如我们想画圆图片,首先,我们需要获得该图片:

		// 获取位图
		Drawable draw = getDrawable();
		if (draw == null) {
			return;
		}
		BitmapDrawable bd = (BitmapDrawable) draw;
		Bitmap mBitmap = bd.getBitmap();
初始化画笔:

		// 实例画笔(抗锯齿|抗抖动)
		mdrawPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
		// 设置着色器
		BitmapShader bs = new BitmapShader(mBitmap, Shader.TileMode.CLAMP,
				Shader.TileMode.CLAMP);
		mdrawPaint.setShader(bs);
绘画:

	@Override
	protected void onDraw(Canvas canvas) {
		
		// 绘制圆角图片
		canvas.drawCircle(120, 120, 120, mdrawPaint);
	}
于是,圆形图片就出来了:

[Android]自定义圆形图片_第1张图片

呃。。怎么和我们想象中的不一样,不过,假如是细心的少年少女们会发现,我绘画圆的代码的圆心位置以及半径皆为固定的,因此这明显不符合逻辑,我们应该是根据ImageView的宽高来画圆才对的

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);

		// 如果类型是圆形,则强制改变view的宽高一致,以小值为准
		imgMinLength = Math.min(getMeasuredWidth(), getMeasuredHeight());
		setMeasuredDimension(imgMinLength, imgMinLength);
		//获取圆的半径
		mRadius = imgMinLength / 2;

	}
绘画:

	@Override
	protected void onDraw(Canvas canvas) {
		
		// 绘制圆角图片
		canvas.drawCircle(mRadius, mRadius, mRadius, mdrawPaint);
	}
效果图:

[Android]自定义圆形图片_第2张图片

嗯,没错,确实是根据ImageView的最小变成来显示了,但是,图片仍未缩放和居中

		// 实例画笔(抗锯齿|抗抖动)
		mdrawPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
		
		// 用于记录图片缩放移动等改动
		Matrix matrix = new Matrix();
		// 根据图片的宽高对图片进行缩放,与centerCrop相似,同时,对缩放后的图片进行居中显示
		if (mBitmap.getWidth() > mBitmap.getHeight()) {
			float mDrawScale = imgMinLength * 1.0f / mBitmap.getHeight();
			matrix.setScale(mDrawScale, mDrawScale);
			matrix.postTranslate(
					-(mBitmap.getWidth() * mDrawScale / 2 - mRadius), 0);
		} else {
			float mDrawScale = imgMinLength * 1.0f / mBitmap.getWidth();
			matrix.setScale(mDrawScale, mDrawScale);
			matrix.postTranslate(0,
					-(mBitmap.getHeight() * mDrawScale / 2 - mRadius));
		}
		// 设置着色器
		BitmapShader bs = new BitmapShader(mBitmap, Shader.TileMode.CLAMP,
				Shader.TileMode.CLAMP);
		bs.setLocalMatrix(matrix);
		mdrawPaint.setShader(bs);
图片缩放讲解:centerCrop的效果是将图片缩放至占满ImageView,多余的地方截取。由于我们是制作圆形,因此ImageView的宽高是一样的,我们只需要判断出图片的宽高的大小,将最小的一边缩放至ImageView的大小即可

图片居中讲解:计算出缩放后图片的中心位置减去ImageView的中心位置,即可获得图片需要移动的距离
效果图:


O了,圆形图片就这样完成了

源码:

http://download.csdn.net/detail/u011596810/9417285




你可能感兴趣的:(android,图片,圆形)