在drawable文件夹之外使用的.9.png文件?
我需要从drawable文件夹外部加载9补丁文件。这样一来,我的应用程序便可以从服务器下载新皮肤。我发现制作.apk时会编译存储在drawable文件夹中的9补丁图像。从资产文件夹读取的完全相同的文件没有9修补程序块。因此,制作.apk的行为是在可绘制文件夹中而不是在Assets目录中编译源9补丁文件。
我如何自己编译一个9补丁文件,以便可以将其安装在资产目录中?是否有一个(批处理)工具可以将源代码转换为带有9个补丁的块的编译版本?我真的非常希望不必使用Eclipse / Ant来构建.apk,然后尽可能地将其拆开以提取编译的9补丁文件。
现在,我只希望能够从assets目录读取(例如,每个皮肤都有一个子目录)以保持简单。下一步是编译源映像,以添加到9修补程序块中。之后,我会担心会即时下载到/ data文件夹-如果我无法编译9-patch文件,那么增加服务器端的工作量毫无意义。
没有简单的方法可以做到这一点。 9补丁编译完成通过aapt进行,非常简单:它会丢弃黑色边框并进行编码
它们的内容在PNG块中。 对您来说,这是微不足道的编写执行类似操作的工具。 请注意,您甚至不需要使用相同的格式。 如果您看一下NinePatch API中的各种 doc,您会看到您可以提交自己的“块”(伸展区域和填充。)chunk byte []数组的结构在这里解释:
/*** This chunk specifies how to split an image into segments for* scaling.** There are J horizontal and K vertical segments. These segments divide* the image into J*K regions as follows (where J=4 and K=3):** F0 S0 F1 S1* +-----+----+------+-------+* S2| 0 | 1 | 2 | 3 |* +-----+----+------+-------+* | | | | |* | | | | |* F2| 4 | 5 | 6 | 7 |* | | | | |* | | | | |* +-----+----+------+-------+* S3| 8 | 9 | 10 | 11 |* +-----+----+------+-------+** Each horizontal and vertical segment is considered to by either* stretchable (marked by the Sx labels) or fixed (marked by the Fy* labels), in the horizontal or vertical axis, respectively. In the* above example, the first is horizontal segment (F0) is fixed, the* next is stretchable and then they continue to alternate. Note that* the segment list for each axis can begin or end with a stretchable* or fixed segment.** The relative sizes of the stretchy segments indicates the relative* amount of stretchiness of the regions bordered by the segments. For* example, regions 3, 7 and 11 above will take up more horizontal space* than regions 1, 5 and 9 since the horizontal segment associated with* the first set of regions is larger than the other set of regions. The* ratios of the amount of horizontal (or vertical) space taken by any* two stretchable slices is exactly the ratio of their corresponding* segment lengths.** xDivs and yDivs point to arrays of horizontal and vertical pixel* indices. The first pair of Divs (in either array) indicate the* starting and ending points of the first stretchable segment in that* axis. The next pair specifies the next stretchable segment, etc. So* in the above example xDiv[0] and xDiv[1] specify the horizontal* coordinates for the regions labeled 1, 5 and 9. xDiv[2] and* xDiv[3] specify the coordinates for regions 3, 7 and 11. Note that* the leftmost slices always start at x=0 and the rightmost slices* always end at the end of the image. So, for example, the regions 0,* 4 and 8 (which are fixed along the X axis) start at x value 0 and* go to xDiv[0] and slices 2, 6 and 10 start at xDiv[1] and end at* xDiv[2].** The array pointed to by the colors field lists contains hints for* each of the regions. They are ordered according left-to-right and* top-to-bottom as indicated above. For each segment that is a solid* color the array entry will contain that color value; otherwise it* will contain NO_COLOR. Segments that are completely transparent* will always have the value TRANSPARENT_COLOR.** The PNG chunk type is "npTc".*/struct Res_png_9patch{Res_png_9patch() : wasDeserialized(false), xDivs(NULL),yDivs(NULL), colors(NULL) { }int8_t wasDeserialized;int8_t numXDivs;int8_t numYDivs;int8_t numColors;// These tell where the next section of a patch starts.// For example, the first patch includes the pixels from// 0 to xDivs[0]-1 and the second patch includes the pixels// from xDivs[0] to xDivs[1]-1.// Note: allocation/free of these pointers is left to the caller.int32_t* xDivs;int32_t* yDivs;int32_t paddingLeft, paddingRight;int32_t paddingTop, paddingBottom;enum {// The 9 patch segment is not a solid color.NO_COLOR = 0x00000001,// The 9 patch segment is completely transparent.TRANSPARENT_COLOR = 0x00000000};// Note: allocation/free of this pointer is left to the caller.uint32_t* colors;// Convert data from device representation to PNG file representation.void deviceToFile();// Convert data from PNG file representation to device representation.void fileToDevice();// Serialize/Marshall the patch data into a newly malloc-ed blockvoid* serialize();// Serialize/Marshall the patch datavoid serialize(void* outData);// Deserialize/Unmarshall the patch datastatic Res_png_9patch* deserialize(const void* data);// Compute the size of the serialized data structuresize_t serializedSize();};
