??最近開(kāi)發(fā)中遇到一個(gè)Glide加載圖片的問(wèn)題,具體表現(xiàn)為同一個(gè)列表源梭,各個(gè)item中ImageView需要裁剪相同大小的圓角徘郭,而使用測(cè)試數(shù)據(jù)填充時(shí)出現(xiàn)了不同item圓角大小不一的情況,這是截圖承疲∪技可以看到冲呢,第一項(xiàng)的圖片圓角明顯比其他的大很多,而且裁剪區(qū)域很模糊招狸。
??對(duì)于這種情況敬拓,開(kāi)始我嘗試了修改scaleType屬性和Glide中修改asBitmap()、centerCrop()裙戏、fitCenter()等方法都沒(méi)有效果乘凸。然后我懷疑是ListView布局復(fù)用的問(wèn)題,可是禁掉了ListView布局優(yōu)化之后還是老樣子挽懦。
Adapter :
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (null == convertView) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_star_topic, null);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (!TextUtils.isEmpty(mList.get(position).getPic())) {
Glide.with(mContext).load(mList.get(position).getPic())
.transform(new GlideRoundTransform(mContext, 3))
.into(holder.mTopicPic);
}
}
GlideRoundTransform :
public GlideRoundTransform(Context context, int dp) {
super(context);
radius = Resources.getSystem().getDisplayMetrics().density * dp;
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
return roundCrop(pool, toTransform);
}
private static Bitmap roundCrop(BitmapPool pool, Bitmap source) {
if (source == null) return null;
Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
if (result == null) {
result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
paint.setAntiAlias(true);
RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
canvas.drawRoundRect(rectF, radius, radius, paint);
return result;
}
??其中adapter中是普通的加載圖片,只是在Glide中加了transform來(lái)實(shí)現(xiàn)圓角裁剪木人,GlideRoundTransform是從其他博客借鑒的信柿,之前用的都沒(méi)有問(wèn)題,自己想不通醒第,就求助大神解答吧渔嚷。
??我在github的glide項(xiàng)目下提了一個(gè)issue,希望有人可以幫忙稠曼,很快得到了回復(fù)形病,他覺(jué)得是圖片尺寸的問(wèn)題,我也用他推薦的override()方法來(lái)重寫(xiě)圖片大小之后再進(jìn)行裁剪,但沒(méi)有效果漠吻,代碼如下:
Glide.with(mContext).load(mList.get(position).getPic())
.override(750,350)
.transform(new GlideRoundTransform(mContext, 3))
.into(holder.mTopicPic);
??然后他問(wèn)為什么第一張圖看著這么模糊量瓜,我才意識(shí)到可能是測(cè)試數(shù)據(jù)出了問(wèn)題,然后也確實(shí)是這樣的途乃,第一張圖和第二張圖尺寸明顯不一樣绍傲,而自定義的GlideRoundTransform是將原始在原始圖片的基礎(chǔ)上裁剪相應(yīng)大小的圓角,對(duì)于尺寸小的圖片裁剪完之后放到固定大小的ImageView中耍共,肯定會(huì)變形烫饼。
??最終的解決方案 :
Glide.with(mContext).load(mList.get(position).getPic())
.override(750,350)
.transform(new fitCenter(),new GlideRoundTransform(mContext, 3))
.into(holder.mTopicPic);
??非常簡(jiǎn)單,就是使用了transfrom的重載方法试读,在傳進(jìn)去transfrom的同時(shí)傳入一個(gè)fitcenter(),先將圖片變換為固定的大小杠纵,然后在此基礎(chǔ)上在進(jìn)行裁剪,再次運(yùn)行之后所有的項(xiàng)的圓角就看著一般大了钩骇。