最近項目要使用.9圖的背景圖,這個背景圖要讀取后臺的配置文件芯急。心想這不很簡單勺届,直接把圖傳上去,直接加載就噢了娶耍。免姿。。榕酒。胚膊。
畢竟還是太年輕了,踩坑入下
- 直接把.9圖傳到七牛云后想鹰,加載的圖片是有黑邊的紊婉,而且不會拉伸。找了一下資料需要對圖片做處理
- 對圖片重新輸出
使用sdk自帶的工具aapt對.9圖重新輸出
aapt c -v -S point_9 -C point_10
以上的是批量輸出的指令辑舷。point_9是要轉(zhuǎn)換的.9圖的文件夾喻犁,point_10是轉(zhuǎn)換輸出的文件。在運行指令是point_10要提前創(chuàng)建何缓,不然會報錯肢础。詳細(xì)的aapt指令自行去查找,這里不做詳細(xì)介紹碌廓。 - 對.9圖加載
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);
} else {
return new BitmapDrawable(context.getResources(), bitmap);
}
return ninePatchDrawable;
}
看到這代碼是不是覺得就ok了....
一開始的時候我也覺得是這樣了传轰,可惜還是太年輕了
- 項目中我們使用的是Glide加載圖片,直接獲取個bitmap傳過去就噢了,一頓操作猛如虎
Glide.with(reference.get())
.asBitmap()
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.dontAnimate()
.dontTransform()
.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
.load(url)
.listener(new RequestListener<Bitmap>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, DataSource dataSource, boolean isFirstResource) {
//TODO 加載.9圖
return true;
}
})
.submit();
用了上面的方法就一路踩坑谷婆,怎么加載NinePatch.isNinePatchChunk(chunk)都識別不了.9圖
- 重新輸出圖片慨蛙,aapt和放進(jìn)項目中打包解壓獲取的圖片都不行
人生路漫漫辽聊,一坑接著一坑
把輸出的圖片放到sd卡的文件夾,然后再去加載----激動的心顫抖的手股淡,竟然闊以身隐。。唯灵。
那問題來了贾铝,什么原因造成的?埠帕?垢揩?
原來重新輸出的圖片,把.9的信息都保存在png的輔助信息了敛瓷,如果對輸出的圖片做壓縮就會這些信息給去掉
校驗的圖片上傳是沒有做壓縮的叁巨,那問題來了一定是glide對圖片進(jìn)行的壓縮處理,哎呐籽,沒有認(rèn)真讀過glide的源碼锋勺,填坑之路蛋疼
File file = Glide.with(reference.get())
.load(url)
.downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
.get();
只能把圖片下載后再去加載,佛祖保佑這次真的能加載出來了