android 從伺服器載入.9圖
問題描述: APP啟動時, 廣告頁的圖片是從伺服器上獲取, 這個圖片一般需要全屏顯示, 這個怎麼適配呢?
解決方法1:如果使用android:scaleType="fitXY"屬性, 圖片肯定會拉伸. 這個時候我們會想到用.9圖
解決方法2:用兩張圖片疊加, 一張純色背景圖, 另一張我們的廣告圖, 背景圖和廣告的背景保持一致就可以了. 純色的背景圖怎麼拉伸都無所謂了.
比較:方法2顯然不如方法1, 這裡我們看看方法1.
嘗試:直接把.9圖放到伺服器上, 結果: 和普通圖片沒什麼區別.
原理:跑去網上看了一下才知道, 原來我們放在本地的.9圖之所以能正常載入, 並不是ImageView直接載入的, 而是在編譯的時候通過了轉換, 最終才能被ImageView使用. 所以我們把.9圖通過手動轉換, 然後把轉換後的圖片放到伺服器, 這樣就可以直接使用了.
第一步: 製作.9圖我是用AS製作的, 如下圖, 選擇圖片右鍵選擇.
注意:
- 如果是.jpg是沒有這個選項的, png圖才有. 其它格式的圖片沒試過.
-
製作.9圖不規範會報錯, 一般只需要畫上和左就可以了.
製作.9圖.png
第二步: 轉換
使用SDK裡面的build-tools工具
-
在build-tools\26.02(版本號) 目錄下開啟cmd. 例如我目錄: C:\Users\dell\AppData\Local\Android\sdk\build-tools\26.0.2.
-
然後輸入命令.\aapt s -i .9圖檔案位置 -o 轉換後文件位置 .
例如:原始檔a.9.png 和 轉換後的檔案b.png都在\sdk\build-tools\26.0.2目錄下. 那我直接在cmd裡面輸入: .\aapt s -i .\a.9.png -o .\b.png 就會生成b.png圖片, 如下圖:
轉換.png
第三步:本來以為這樣就OK了, 結果圖片還是被拉伸了, 一開始我懷疑是不是轉換過程錯了, 後來到網上去查了資料才知道, 還不能直接使用. 需要使用程式碼如下:
byte[] chunk = bitmap.getNinePatchChunk(); if(NinePatch.isNinePatchChunk(chunk)){ NinePatchDrawable npd = new NinePatchDrawable(getResources(), bitmap, chunk, new Rect(), null); imageView.setImageDrawable(npd); }else{ imageView.setImageBitmap(bitmap); }
注意:if裡面是載入.9圖轉換後的圖片, else是普通圖片, 如果不加判斷直接用NinePatchDrawable載入圖片的話, 普通圖片會報錯.
最後新增兩張效果圖. 為了讓效果明顯一點, 故意把imageView高縮短. 主要看中間的圖示.

效果.9圖.png

效果普通圖.png