1. 程式人生 > >Android開發中圖片的適配

Android開發中圖片的適配

全面理解imageview的ScaleType屬性,並做好適配

前言:Android機型的種類大家都知道,適配一直都是一個大問題。所以一直以來對於開發者都是用多套圖來做適配。這樣做可以解決部分適配問題,但是缺點就是給app帶來了負擔,導致app包特別的大。

關於imageview的縮放型別

  1. fitxy:這個是最好理解的,在xy的方向上鋪滿imageview,就像background一樣。所以說是很有可能拉伸圖片的。那麼配合它使用的另一個屬性就要登場了:android:adjustViewBounds=”true”她的意思就是是否保持原始比例,設定為true就是保持原始比例。親測過確實是原始比例。在網上搜了一下看到說這個必須配合maxWidth和maxHeight使用,我沒有設定這個,但是imageview的寬高都是wrapContent,效果就是他會在這個imageview的範圍內按照原始比例“裁剪”到最大的尺寸,不一定會鋪滿這個imageview。
  2. fitStart:字面意思就是適配最開始的位置,我們的習慣就是從左上開始,那麼圖片就會從左上角開始等比例的放大,直到一個方向上撐滿停止。這個屬性值用到的機會很少,這個解釋也比較抽象,這裡放上一張圖輔助理解!imageview的寬高是match_parent,圖片是一張小圖片,xy方向上按比例伸展,直到一個方向上撐滿停止
  3. fitEnd:和fitStart一樣,不一樣的是從右下角開始伸展,不再細說
  4. fitCenter:等比例縮放,直到一個方向撐滿,然後居中顯示
  5. center:不會縮放圖片,居中顯示,如果圖片過大會超出螢幕
  6. center_crop:圖片等比縮放,直到一個方向上撐滿,居中顯示,超出螢幕的地方會被裁剪
  7. center_insid:只有圖片的長寬大於控制元件時,才會縮放圖片,然後居中顯示
  8. 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。但是這個必須小心使用。