参考资料:http://blog.csdn.net/lmj623565791/article/details/41967509
实现圆形ImageView 的方法总结:
一、利用BitmapShader完成圆形的图片:
思路:
1、就是利用Matrix来缩放图片,设置好Matrix后;
2、初始化BitmapShader,图片bitmap就是放在bitmapShader中的,然后bitmapShader.setLocalMatrix(matrix)来缩放图片的大小;
3、然后画笔bimapPaint.setShader(bitmapShader),就把图片及相关信息给了画笔;
4、最后canvas.drawCircle(…)就完成了圆形的ImageView。
//获取图片
bitmap = getBitmapFromDrawable(getDrawable());
//图片的画笔
bitmapPaint = new Paint();
//参数值就代表 如果图片太小的话 就直接拉伸,TileMode.REPEAT参数代表 图片大小的话就重复放图片 TileMode.MIRROR就是镜像对着放图片的意思 跟大家设置pc 屏保时候其实是一样的
bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
//缩放图片
bitmapShader.setLocalMatrix(getBitmapMatrix());
bitmapPaint.setAntiAlias(true);
bitmapPaint.setShader(bitmapShader);
//开始画圆形的图片
canvas.save();
//这里是计算圆的半径(视情况而定)
float bitmapRadius = radius * outRingRadiusPercent - radius * ringWidthRadiusPercent / 2;
//这行代码就是把imageview 切割成最终的圆形
canvas.drawCircle(width / 2f, height / 2f, bitmapRadius, bitmapPaint);
canvas.restore();
缩放图片的方法
/**
* 缩放图片
*
* @return
*/
private Matrix getBitmapMatrix() {
int bitmapWidth = bitmap.getWidth();
int bitmapHeight = bitmap.getHeight();
float d = (radius * outRingRadiusPercent - radius * ringWidthRadiusPercent / 2) * 2;
Matrix matrix = new Matrix();
float scale = 1f;
if (bitmapHeight > bitmapWidth) {
scale = d / (float) bitmapWidth;
} else {
scale = d / (float) bitmapHeight;
}
matrix.setScale(scale, scale);
return matrix;
}
注意:
此方法实现的圆形ImageView中的图片的大小只能大于等于控件的大小,既当图片的高宽小于控件的高宽时,图片总是处于左上角的位置,不能居中,设置android:scaleTyel=”center”也不管用。
二、利用ShapeDrawable来实现
思路:
1、同样用Matrix和bitmapShader来进行图片的缩放;
2、利用ShapeDrawable 来控制图片的形状(圆形),及利用shapeDrawable.setBounds()来设置图片的位置;
/**
* 画圆形图片
*
* @param canvas
*/
private void drawBitmap(Canvas canvas) {
//获取图片
bitmap = getBitmapFromDrawable(getDrawable());
//参数值就代表 如果图片太小的话 就直接拉伸,TileMode.REPEAT参数代表 图片大小的话就重复放图片 TileMode.MIRROR就是镜像对着放图片的意思 跟大家设置pc 屏保时候其实是一样的
bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
//缩放图片
bitmapShader.setLocalMatrix(getBitmapMatrix());
//OvalShape 表示椭圆,只要宽高一样,就是圆
ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape());
//设置画笔的shader,进行图片的缩放
shapeDrawable.getPaint().setShader(bitmapShader);
//确定图片的位置,既当图片的宽高小于控件的宽高时
int left = (int)(radius - (radius * outRingRadiusPercent - radius*ringWidthRadiusPercent/2));
int top = left;
int right = (int)(left + (radius * outRingRadiusPercent - radius*ringWidthRadiusPercent/2)*2);
int bottom = right;
shapeDrawable.setBounds(left,top,right,bottom);
//画图
shapeDrawable.draw(canvas);
}
注意:
此方法就可以按照自己的意愿来控制图片显示的位置。