问题简述:
最近项目做了聊天气泡的需求,要求能够购买聊天气泡,也就是说要从服务器上获取气泡图。聊天气泡图一般使用.9的方式实现,但是在调试过程中发现,从服务器上获取.9图片的话,.9图片会失效,气泡会被拉伸。在查找一些文档后发现,.9图不能直接放到服务器上,必须经过Android的工具编译,然后下载图片后需要用NinePatchDrawable类重新处理后才生效。
解决步骤:
1、编译.9图片
在拿到.9图后,我们可以看到.9图四周会存在黑边,这个时候我们需要先编译.9图,有如下两种方式:
1.比较笨的一种方式:打包apk再解压
1)将画好线的.9图放在任意一个Android工程中
2)从Android工程bin目录下拷贝apk
3)将apk后缀名修改为zip等可解压的文件,并对其解压
4)解压后你会发现,对应的res文件夹下有我们之前放的.9图片
2.通过android build tools aapt
该工具伟大的Google已经提供,就在sdk/build-tools/xxx目录下(Windows环境下,步骤):
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、创建一个你要存放目标文件的目录,例如D:\chatbgbuild (实践证明,这个文件夹必须在运行编译之前创建好,否则会报错)
4、编译:aapt.exe c -v -S D:\chatbg -C D:\chatbgbuild
之后便可以看到chatbg中的需要编译的图片都编译到chatbgbuild中了,而且大小尺寸都有改变
2、代码处理
将编译过后的图片放到服务器后,下载图片,然后设置setBackgroundDrawable的方式直接设置背景,背景还是被拉伸了,这里需要用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、经过这两步处理后,气泡背景图不会被拉伸,但是.9的右线和底线的文字显示区域设置还是无效,不过我们可以通过设置padding来解决:
view.setPadding(leftPadding,topPadding,rightPadding,bottomPadding)
2、Android编译过后的气泡图IOS不能用,所以IOS平台跟Android平台的图片资源后台需要分开处理,不能用统一的图片。