现象
原图不设置的情况:
设置radius为100的情况:
处理步骤
1.按需求,其设置的radius是2像素,不容易发现,也不便于观察,放大效果,有利于发现问题。放大效果如上图所示。
2.重审代码实现。
首先查看ImageView与之相关的属性设置。例如,确认scaleType属性设置对图片圆角设置的影响。理解对应scaleType属性值设置的具体含义。(按比例缩放原图,但是多余的部分会被裁剪,所以图片不会变形,但是可能会有部分显示不全),快速试错,排除问题。
查看Picasso中圆角处理代码。借助debug模式,分析各参数的变化。来走一个。
Picasso处理圆角的代码:
@Override
public
Bitmap transform(Bitmap source) {
//获取宽,高
int width = source.getWidth();
int height = source.getHeight();
Bitmap.Config config = source.getConfig() != null ? source.getConfig() : Bitmap.Config.ARGB_8888;
//创建一张可以操作的正方形图片的位图
Bitmap bitmap = Bitmap.createBitmap(width, height, config);
//创建一个画布Canvas
Canvas canvas = new Canvas(bitmap);
//创建画笔
Paint paint = new Paint();
BitmapShader shader = new BitmapShader(source, BitmapShader.TileMode.CLAMP,BitmapShader.TileMode.CLAMP);
paint.setShader(shader);
paint.setAntiAlias(true);
canvas.drawRoundRect(new RectF(0, 0, width, height), radius, radius, paint);
source.recycle();
return bitmap;
}
从上面的断点调试可以看出,我们获取的图片是原生大小,我们在原生图片上做了一个圆角处理,然后将它缩放在一个46*46的ImageView中,使用的scaleType是centerCrop。那答案就有了,对不同的图片做相同的radius,然后再一缩放,很明显,缩放后呈现的大小肯定不一样。而且如果图片不是正方形,按比例缩放后,多余的部分会被裁剪,所以圆角就被裁剪掉了~~
解决方案
那我们首先获取一个正方形的图片,然后再按比例计算,如果缩小的图片设置的radius是2的话,那么原大小的radius要设置多大。
参考答案地址:http://stackoverflow.com/questions/30704581/make-imageview-with-round-corner-using-picasso
@Override
public Bitmap transform(Bitmap source) {
//获取最小边长
int size = Math.min(source.getWidth(), source.getHeight());
//获取正方形图片的左上角坐标
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
//创建一个正方形区域的Bitmap
Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size);
if (squaredBitmap != source) {
source.recycle();
}
Bitmap.Config config = source.getConfig() != null? source.getConfig() : Bitmap.Config.ARGB_8888;
//创建一张可以操作的正方形图片的位图
Bitmap bitmap = Bitmap.createBitmap(size, size, config);
//创建一个画布Canvas
Canvas canvas = new Canvas(bitmap);
//创建画笔
Paint paint = new Paint();
BitmapShader shader = new BitmapShader(squaredBitmap,BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
paint.setShader(shader);
paint.setAntiAlias(true);
float actualRadius = radius;
if(defaultSize > 0) {
actualRadius = radius * size / defaultSize;
}
canvas.drawRoundRect(new RectF(0, 0, size, size), actualRadius,actualRadius, paint);
squaredBitmap.recycle();
return bitmap;
}