Android程序员对NinePatch文件一定很熟悉,因为它的应用实在是太广泛了,当图像需要拉伸或收缩时,一定会首先考虑到它,而由于Android设备那五花八门的分辨率,图像的拉伸收缩几乎是不可避免的....

Google已经为我们安排好了一个简单有效的NinePatch使用模式:

[list]
[*]创建图像文件
[*]使用sdk/tools/draw9patch工具,选择图像的拉伸收缩区域,以及内容显示区域(可选)
[*]将draw9patch生成的*.9.png文件复制到res/drawable目录中
[*]在UI文件或者程序代码中,直接使用文件对应的Drawable
[/list]
通常情况下,这种模式工作得很好,但有时候,我们还想要更多....比如,我们的图像来源于互联网,而不是编译到App中固定的图像
那就要我们自己创建新的应用模式了:
[list]
[*](同上)创建图像文件
[*](同上)使用sdk/tools/draw9patch工具,选择图像的拉伸收缩区域,以及内容显示区域(可选)
[*]将draw9patch生成的*.9.png编译为Android特有的格式(还是可正常显示的png文件,但是将draw9patch中生成的上下左右4条边裁掉了,相关信息生成chunk数据嵌入png文件中)
[*]使用BitmapFactory载入编译后的NinePatch图像文件,获得Bitmap对象bmp
[*]确认Bitmap是合法的NinePatch文件:NinePatch.isNinePatchChunk(bmp.getNinePatchChunk())
[*]生成NinePatchDrawable对象:new NinePatchDrawable(getResources(), bmp, chunk, new Rect(), null);
[/list]
关于上面的步骤3:编译*.9.png文件,我还没有找到更简单的方法,目前的方法是,先创建一个傀儡App,将需要编译的9.png放入这个App并生成APK,再unzip这个APK文件并从res/drawable目录下取出编译后的*.9.png文件。另外,也有人做了命令行工具abrc可以编译*.9.png文件([url]http://forum.xda-developers.com/showthread.php?t=785012[/url])
另外,如果图像定义了内容显示区(NinePatch图像的右下黑边),我们需要从chunk数据中解出其上下左右的padding数据,上面的步骤6需要修改一下才能在NinePatchDrawable中获得正确的padding rect,具体代码可参考这里:[url]http://stackoverflow.com/questions/11065996/ninepatchdrawable-does-not-get-padding-from-chunk[/url]