Building a 9 patch drawable at runtime Building a 9 patch drawable at runtime android android

Building a 9 patch drawable at runtime


It's working for me after I updated the code. I think the color size made it unhappy for some reason(Based on the comments in the android source code each patch has a color hint, setting fewer than the number of sections in this case 9 appears to cause problems). I haven't tested with your image yet.

public static NinePatch createFixedNinePatch(Resources res, Bitmap bitmap, int top, int left, int bottom, int right, String srcName){    ByteBuffer buffer = getByteBufferFixed(top, left, bottom, right);    NinePatch patch = new NinePatch(bitmap, buffer.array(), srcName);    return patch;}public static ByteBuffer getByteBufferFixed(int top, int left, int bottom, int right) {    //Docs check the NinePatchChunkFile    ByteBuffer buffer = ByteBuffer.allocate(84).order(ByteOrder.nativeOrder());    //was translated    buffer.put((byte)0x01);    //divx size    buffer.put((byte)0x02);    //divy size    buffer.put((byte)0x02);    //color size    buffer.put(( byte)0x09);    //skip    buffer.putInt(0);    buffer.putInt(0);    //padding    buffer.putInt(0);    buffer.putInt(0);    buffer.putInt(0);    buffer.putInt(0);    //skip 4 bytes    buffer.putInt(0);    buffer.putInt(left);    buffer.putInt(right);    buffer.putInt(top);    buffer.putInt(bottom);    buffer.putInt(NO_COLOR);    buffer.putInt(NO_COLOR);    buffer.putInt(NO_COLOR);    buffer.putInt(NO_COLOR);    buffer.putInt(NO_COLOR);    buffer.putInt(NO_COLOR);    buffer.putInt(NO_COLOR);    buffer.putInt(NO_COLOR);    buffer.putInt(NO_COLOR);    return buffer;}


Putting together all I've spotted so far, and honing it a bit:

  • There doesn't seem to be a difference in the Res_png_9patch structure (which the byte chunk goes into) between android versions (see http://code.metager.de/source/xref/android), so that doesn't look like the cause.

  • Other answers about nine patch drawables suggest that each region (especially stretchable ones) should be at least 2x2 pixels (if not 3x3), but outside of that smaller is better.

  • However, the way some of the byte chunk is allocated looks like it could be updated. Try setting the 4th byte to 9 (the number of patches, I think), adding 7 more NO_COLORs to the the end and moving its size up to 56 + (7 x 4) = 84 bytes