Android如何从网络获取.9图片

作者: levinandroid | 来源:发表于2017-08-03 19:47 被阅读330次

问题简述:

最近项目做了聊天气泡的需求,要求能够购买聊天气泡,也就是说要从服务器上获取气泡图。聊天气泡图一般使用.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平台的图片资源后台需要分开处理,不能用统一的图片。

相关文章

网友评论

    本文标题:Android如何从网络获取.9图片

    本文链接:https://www.haomeiwen.com/subject/wauplxtx.html