問題簡述:
最近項目做了聊天氣泡的需求,要求能夠購買聊天氣泡,也就是說要從服務(wù)器上獲取氣泡圖。聊天氣泡圖一般使用.9的方式實現(xiàn),但是在調(diào)試過程中發(fā)現(xiàn),從服務(wù)器上獲取.9圖片的話,.9圖片會失效,氣泡會被拉伸。在查找一些文檔后發(fā)現(xiàn),.9圖不能直接放到服務(wù)器上,必須經(jīng)過Android的工具編譯,然后下載圖片后需要用NinePatchDrawable類重新處理后才生效。
解決步驟:
1、編譯.9圖片
在拿到.9圖后,我們可以看到.9圖四周會存在黑邊,這個時候我們需要先編譯.9圖,有如下兩種方式:
1.比較笨的一種方式:打包apk再解壓
1)將畫好線的.9圖放在任意一個Android工程中
2)從Android工程bin目錄下拷貝apk
3)將apk后綴名修改為zip等可解壓的文件,并對其解壓
4)解壓后你會發(fā)現(xiàn),對應(yīng)的res文件夾下有我們之前放的.9圖片
2.通過android build tools aapt
該工具偉大的Google已經(jīng)提供,就在sdk/build-tools/xxx目錄下(Windows環(huán)境下,步驟):
1、cd到自己的sdk/build-tools/xxx目錄下,如我的:D:\SDK5.0\build-tools\25.0.2 可以看到里面有個文件是aapt.exe
2、準備好你要編譯的圖片文件,最好將所有要編譯的圖片都放到一個文件夾下,如我的放在D:\chatbg目錄下,該目錄下有一張.9圖“chat_bg.9.png”
3、創(chuàng)建一個你要存放目標文件的目錄,例如D:\chatbgbuild (實踐證明,這個文件夾必須在運行編譯之前創(chuàng)建好,否則會報錯)
4、編譯:aapt.exe c -v -S D:\chatbg -C D:\chatbgbuild
之后便可以看到chatbg中的需要編譯的圖片都編譯到chatbgbuild中了,而且大小尺寸都有改變
2、代碼處理
將編譯過后的圖片放到服務(wù)器后,下載圖片,然后設(shè)置setBackgroundDrawable的方式直接設(shè)置背景,背景還是被拉伸了,這里需要用NinePatchDrawable類處理一下圖片:
private Drawable getNinePatchDrawable(Bitmap bitmap,Context context) {
byte[] chunk =bitmap.getNinePatchChunk();
NinePatchDrawable ninePatchDrawable = null;
if(NinePatch.isNinePatchChunk(chunk)){
ninePatchDrawable = new NinePatchDrawable(context.getResources(), bitmap, chunk,
new Rect(), null);
}
return ninePatchDrawable;
private Drawable getNinePatchDrawable(File file, Context context) {
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
byte[] chunk = bitmap.getNinePatchChunk();
NinePatchDrawable ninePatchDrawable = null;
if (NinePatch.isNinePatchChunk(chunk)) {
ninePatchDrawable = new NinePatchDrawable(context.getResources(), bitmap, chunk,
new Rect(), null);
}
return ninePatchDrawable;
}
3、補充說明:
1、經(jīng)過這兩步處理后,氣泡背景圖不會被拉伸,但是.9的右線和底線的文字顯示區(qū)域設(shè)置還是無效,不過我們可以通過設(shè)置padding來解決:
view.setPadding(leftPadding,topPadding,rightPadding,bottomPadding)
2、Android編譯過后的氣泡圖IOS不能用,所以IOS平臺跟Android平臺的圖片資源后臺需要分開處理,不能用統(tǒng)一的圖片。