android picasso圆角,Picasso设置的圆角,圆角显示有大有小不一致

现象

原图不设置的情况:

448440938a25

屏幕快照 2016-12-18 下午2.25.17.png

设置radius为100的情况:

448440938a25

屏幕快照 2016-12-18 下午2.25.26.png

处理步骤

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;

}

448440938a25

屏幕快照 2016-12-18 下午2.29.53.png

从上面的断点调试可以看出,我们获取的图片是原生大小,我们在原生图片上做了一个圆角处理,然后将它缩放在一个46*46的ImageView中,使用的scaleType是centerCrop。那答案就有了,对不同的图片做相同的radius,然后再一缩放,很明显,缩放后呈现的大小肯定不一样。而且如果图片不是正方形,按比例缩放后,多余的部分会被裁剪,所以圆角就被裁剪掉了~~

解决方案

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值