废话不多说,我们来看看效果吧:
原图: 效果图:
大概效果就是这样了,其中的功能包括:
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); }于是,圆形图片就出来了:
呃。。怎么和我们想象中的不一样,不过,假如是细心的少年少女们会发现,我绘画圆的代码的圆心位置以及半径皆为固定的,因此这明显不符合逻辑,我们应该是根据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); }效果图:
嗯,没错,确实是根据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