600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > android picasso圆角 Picasso设置的圆角 圆角显示有大有小不一致

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

时间:2024-03-24 04:23:27

相关推荐

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

现象

原图不设置的情况:

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

设置radius为100的情况:

屏幕快照 -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;

}

屏幕快照 -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;

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。