用了很久的Glide澜躺,最近在使用Glide3時(shí)突然想到一個(gè)問題酷窥,大家都知道使用Glide的override方法可以重寫圖片大小。而View的setLayoutParams則可以設(shè)置ImageView的大小。代碼如下:
//Glide的override()方法設(shè)置圖片大小
Glide.with(this).load(R.mipmap.mantou).override(500, 500).into(imageView5);
//View的setLayoutParams設(shè)置ImageView大小
LinearLayout.LayoutParams params1 = (LinearLayout.LayoutParams) imageView6.getLayoutParams();
params1.width = 100;
params1.height = 100;
imageView6.setLayoutParams(params1);
那么這兩者在使用時(shí)有什么相似和區(qū)別呢别瞭?帶著這樣的疑問,我開始嘗試探索兩者間的區(qū)別只冻。
布局文件很簡單庇麦,使用NestedScrollView包裹LinearLayout布局,在LinearLayout布局中放入ImageView比較喜德,就不貼了山橄,所有的ImageView的寬高都使用wrap_content來設(shè)置的。
測試一:第一列使用override設(shè)置圖片住诸,第二列使用setLayoutParams
先看看設(shè)置后的效果:
可以看到驾胆,看起來幾乎沒有區(qū)別,ImageView的大小和圖片的分辨率看起來都是一模一樣的贱呐。
來看一下代碼丧诺,都設(shè)置了同樣的寬高:
//設(shè)置第一列圖片
Glide.with(this).load(R.mipmap.mantou).override(100, 100).into(imageView1);
Glide.with(this).load(R.mipmap.mantou).override(200, 200).into(imageView2);
Glide.with(this).load(R.mipmap.mantou).override(300, 300).into(imageView3);
Glide.with(this).load(R.mipmap.mantou).override(400, 400).into(imageView4);
Glide.with(this).load(R.mipmap.mantou).override(500, 500).into(imageView5);
//設(shè)置第二列圖片
LinearLayout.LayoutParams params1 = (LinearLayout.LayoutParams) imageView6.getLayoutParams();
params1.width = 100;
params1.height = 100;
imageView6.setLayoutParams(params1);
LinearLayout.LayoutParams params2 = (LinearLayout.LayoutParams) imageView7.getLayoutParams();
params2.width = 200;
params2.height = 200;
imageView7.setLayoutParams(params2);
LinearLayout.LayoutParams params3 = (LinearLayout.LayoutParams) imageView8.getLayoutParams();
params3.width = 300;
params3.height = 300;
imageView8.setLayoutParams(params3);
LinearLayout.LayoutParams params4 = (LinearLayout.LayoutParams) imageView9.getLayoutParams();
params4.width = 400;
params4.height = 400;
imageView9.setLayoutParams(params4);
LinearLayout.LayoutParams params5 = (LinearLayout.LayoutParams) imageView10.getLayoutParams();
params5.width = 500;
params5.height = 500;
imageView10.setLayoutParams(params5);
但實(shí)際情況真的是像我們?nèi)庋鬯吹降膯幔课依^續(xù)帶著疑問奄薇,做了測試2驳阎。
測試二:給圖片添加背景顏色
也就是在xml文件中給2個(gè)ImageView都設(shè)置了一個(gè)background顏色。
代碼如下:
private void test2() {
Glide.with(this).load(R.mipmap.mantou).override(400, 400).into(imageView11);
LinearLayout.LayoutParams params12 = (LinearLayout.LayoutParams) imageView12.getLayoutParams();
params12.width = 400;
params12.height = 400;
imageView12.setLayoutParams(params12);
}
明顯看出2個(gè)ImageView的大小是不同的馁蒂,打印他們的寬高如下:
2019-03-31 11:05:58.555 6705-6705/com.heyzqt.staggeredgridviewdemo I/hello: test2: imageview11 width = 311,imageview11 height = 400
2019-03-31 11:05:54.620 6705-6705/com.heyzqt.staggeredgridviewdemo I/hello: test2: imageView12 width = 400,imageView12 height = 400
結(jié)合現(xiàn)象分析呵晚,當(dāng)使用setLayoutParams設(shè)置ImageView寬高為400x400時(shí),ImageView被設(shè)置成指定大小沫屡,因?yàn)镮mageView默認(rèn)的scaleType為fitCenter饵隙,所以圖片被等比例縮放顯示在了ImageView居中位置。
當(dāng)使用override設(shè)置圖片大小為400x400時(shí)沮脖,打印出ImageView的寬高為311x400金矛,因?yàn)镚lide默認(rèn)設(shè)置圖片的scaleType也是fitCenter。那么猜測應(yīng)該是Glide根據(jù)fitCenter的標(biāo)準(zhǔn)來等比例設(shè)置了圖片的大小勺届,而ImageView寬高是wrap_content驶俊,所以當(dāng)圖片大小確定后,ImageView的大小就是圖片大小免姿。
帶著這種猜想給左側(cè)圖片添加了centerCrop();
Glide.with(this).load(R.mipmap.mantou).override(400, 400).centerCrop().into(imageView11);
顯示如下:
寬高打印信息
2019-03-31 11:40:05.625 7118-7118/com.heyzqt.staggeredgridviewdemo I/hello: test2: imageview11 width = 400,imageview11 height = 400
2019-03-31 11:40:01.740 7118-7118/com.heyzqt.staggeredgridviewdemo I/hello: test2: imageView12 width = 400,imageView12 height = 400
左側(cè)通過override重寫大小的圖片寬高變成了400x400饼酿,那么說明上面我的猜想是正確的,確實(shí)跟scaleType的值有關(guān)胚膊。
了解清楚了上面的知識(shí)點(diǎn)故俐,我又產(chǎn)生了新的想法,當(dāng)override和setLayoutparams同時(shí)設(shè)置在一張圖片上時(shí)紊婉,又會(huì)是什么樣的效果呢药版?帶著這樣的疑問,我又做了第3個(gè)測試肩榕。
測試三:同時(shí)使用override和setLayoutParams設(shè)置一張圖片
先看下代碼:
private void test3() {
//override(10,10)
LinearLayout.LayoutParams params13 = (LinearLayout.LayoutParams) imageView13.getLayoutParams();
params13.width = 400;
params13.height = 400;
imageView13.setLayoutParams(params13);
Glide.with(this).load(R.mipmap.mantou).override(10, 10).into(imageView13);
//override(400,400)
Glide.with(this).load(R.mipmap.mantou).override(400, 400).into(imageView14);
LinearLayout.LayoutParams params14 = (LinearLayout.LayoutParams) imageView14.getLayoutParams();
params14.width = 400;
params14.height = 400;
imageView14.setLayoutParams(params14);
}
注意上下兩端代碼的相同點(diǎn)和區(qū)別
相同點(diǎn):
- 都使用了override()和setLayoutParams()方法來設(shè)置圖片刚陡。
- setLayoutParams方法設(shè)置的寬高都是相同的400x400
區(qū)別:
- 左側(cè)圖片override(10,10)惩妇,右側(cè)圖片override(400,400)
- 左側(cè)圖片setLayoutParams方法在前,override方法在后筐乳,右側(cè)圖片override方法在前歌殃,setLayoutParams方法在后
了解清相似和區(qū)別后,來看一下實(shí)際效果圖蝙云。
再看一下打印信息:
2019-03-31 11:59:36.344 7480-7480/com.heyzqt.staggeredgridviewdemo I/hello: test3: imageView13 width = 400,imageView13 height = 400
2019-03-31 11:59:36.344 7480-7480/com.heyzqt.staggeredgridviewdemo I/hello: test3: imageView14 width = 400,imageView14 height = 400
從打印信息可以知道氓皱,不管Glide和setLayoutParams順序,ImageView最終都是以setLayoutParams設(shè)置的寬高為準(zhǔn)勃刨,所以兩張圖的ImageView的大小一樣波材,都是400x400。
但是前者很糊身隐,后者則清晰很多廷区,對(duì)比代碼應(yīng)該是override設(shè)置了圖片大小的原因。左邊將圖片大小設(shè)置為10x10(根據(jù)fitcenter放大居中)贾铝,然后再將10x10的圖設(shè)置到400x400的ImageView中隙轻,所以圖片糊掉了,而右邊的圖則在override設(shè)置為400x400的情況下就清晰很多垢揩。
如果對(duì)你有幫助的話玖绿,點(diǎn)贊、評(píng)論叁巨、贊賞都是對(duì)我的鼓勵(lì)斑匪,也是支持我寫下去的動(dòng)力,謝謝锋勺!