現(xiàn)象
原圖不設(shè)置的情況:
設(shè)置radius為100的情況:
處理步驟
1.按需求,其設(shè)置的radius是2像素扫皱,不容易發(fā)現(xiàn),也不便于觀察捷绑,放大效果韩脑,有利于發(fā)現(xiàn)問題。放大效果如上圖所示粹污。
2.重審代碼實現(xiàn)段多。
首先查看ImageView與之相關(guān)的屬性設(shè)置。例如壮吩,確認scaleType屬性設(shè)置對圖片圓角設(shè)置的影響衩匣。理解對應(yīng)scaleType屬性值設(shè)置的具體含義蕾总。(按比例縮放原圖,但是多余的部分會被裁剪琅捏,所以圖片不會變形,但是可能會有部分顯示不全)递雀,快速試錯柄延,排除問題。
查看Picasso中圓角處理代碼缀程。借助debug模式搜吧,分析各參數(shù)的變化。來走一個杨凑。
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;
//創(chuàng)建一張可以操作的正方形圖片的位圖
Bitmap bitmap = Bitmap.createBitmap(width, height, config);
//創(chuàng)建一個畫布Canvas
Canvas canvas = new Canvas(bitmap);
//創(chuàng)建畫筆
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;
}
從上面的斷點調(diào)試可以看出滤奈,我們獲取的圖片是原生大小,我們在原生圖片上做了一個圓角處理撩满,然后將它縮放在一個46*46的ImageView中蜒程,使用的scaleType是centerCrop。那答案就有了伺帘,對不同的圖片做相同的radius昭躺,然后再一縮放,很明顯伪嫁,縮放后呈現(xiàn)的大小肯定不一樣领炫。而且如果圖片不是正方形,按比例縮放后张咳,多余的部分會被裁剪帝洪,所以圓角就被裁剪掉了~~
解決方案
那我們首先獲取一個正方形的圖片,然后再按比例計算脚猾,如果縮小的圖片設(shè)置的radius是2的話葱峡,那么原大小的radius要設(shè)置多大。
參考答案地址: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());
//獲取正方形圖片的左上角坐標(biāo)
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
//創(chuàng)建一個正方形區(qū)域的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;
//創(chuàng)建一張可以操作的正方形圖片的位圖
Bitmap bitmap = Bitmap.createBitmap(size, size, config);
//創(chuàng)建一個畫布Canvas
Canvas canvas = new Canvas(bitmap);
//創(chuàng)建畫筆
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;
}