Android開發中圖片的適配
阿新 • • 發佈:2019-02-09
全面理解imageview的ScaleType屬性,並做好適配
前言:Android機型的種類大家都知道,適配一直都是一個大問題。所以一直以來對於開發者都是用多套圖來做適配。這樣做可以解決部分適配問題,但是缺點就是給app帶來了負擔,導致app包特別的大。
關於imageview的縮放型別
- fitxy:這個是最好理解的,在xy的方向上鋪滿imageview,就像background一樣。所以說是很有可能拉伸圖片的。那麼配合它使用的另一個屬性就要登場了:android:adjustViewBounds=”true”她的意思就是是否保持原始比例,設定為true就是保持原始比例。親測過確實是原始比例。在網上搜了一下看到說這個必須配合maxWidth和maxHeight使用,我沒有設定這個,但是imageview的寬高都是wrapContent,效果就是他會在這個imageview的範圍內按照原始比例“裁剪”到最大的尺寸,不一定會鋪滿這個imageview。
- fitStart:字面意思就是適配最開始的位置,我們的習慣就是從左上開始,那麼圖片就會從左上角開始等比例的放大,直到一個方向上撐滿停止。這個屬性值用到的機會很少,這個解釋也比較抽象,這裡放上一張圖輔助理解!
- fitEnd:和fitStart一樣,不一樣的是從右下角開始伸展,不再細說
- fitCenter:等比例縮放,直到一個方向撐滿,然後居中顯示
- center:不會縮放圖片,居中顯示,如果圖片過大會超出螢幕
- center_crop:圖片等比縮放,直到一個方向上撐滿,居中顯示,超出螢幕的地方會被裁剪
- center_insid:只有圖片的長寬大於控制元件時,才會縮放圖片,然後居中顯示
- matrix:寬度撐滿居上或居下顯示,高度撐滿居左或居右顯示。
以寬度撐滿居上顯示為例的使用方式:
1⃣️:自定義imageview,重寫setFrame方法
@Override
protected boolean setFrame(int l, int t, int r, int b) {
boolean changed = super.setFrame(l,t,r,b);
if(getScaleType() == ScaleType.MATRIX){
transformMatrix();
}
return changed;
}
private void transformMatrix(){
Matrix matrix = getMatrix();
float w = getWidth();
float cw = getDrawable().getIntrinsicWidth();
float widthScaleFactor = w/cw;
matrix.setScale(widthScaleFactor,widthScaleFactor,0,0);
setImageMatrix(matrix);
}
2⃣️:佈局中使用這個imageview並設定scaleType的屬性為matrix
總結
理解了上邊的屬性問題,我們就拿一張圖來談談適配問題。圖片的適配無非就是原比例顯示,不能變形。我們可以根據畫素轉換為dp的形式設定imageview的寬高,然後拿最大的圖來適配,上面說的所有的等比縮放的都可以使用。最常用的就是center_crop和fitxy。但是這個必須小心使用。