在运行时构建9个可绘制的补丁

And*_*dre 13 graphics android bytearray nine-patch android-drawable

我使用Brian Griffey提供的优秀要点(在此处找到),在Android 3.0+上成功构建了一个9patch drawable .

基本上我从网络加载原始(无补丁)图形文件,文件名包含我需要使用的上限,以便相应地缩放图像.然后我使用这些值与上面找到的类,并应用该图像作为背景的各种元件(如TextView,ImageButton,Button,ViewGroup,等等).

这可以完美地工作,你可以在这里看到:

Android 3.0+结果

但是,在Android 2.3.x上运行相同的代码会产生结果:

Android 2.x结果

我查看了Android中使用的源代码来解析9patch图像(此处此处),但没有找到使其正常工作的方法.我已经尝试了几乎所有我可以抛出的东西都无济于事.

为了记录,9patch由每个轴上的三列组成,一个固定,一个可伸缩,一个固定.

这里希望别人之前解决过这个问题.

提前致谢.

编辑我只对在Android 2.3及更高版本上复制此行为感兴趣(我最初有2.x).

编辑#2这个要点准确描述了我正在尝试做的事情 +源图像:源图像

编辑#3图像的大小为22px/58px(宽度/高度),插图为14/6/14/6(上/左/下/右).

Jim*_*aca 16

更新代码后,它对我有用.我认为颜色大小因为某些原因而变得不开心(基于android源代码中的注释,每个补丁都有一个颜色提示,设置少于这个案例中的部分数量9似乎会导致问题).我还没有测试你的图像.

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;
}
Run Code Online (Sandbox Code Playgroud)


Nei*_*end 5

把我到目前为止发现的所有内容放在一起,并稍微磨练一下:

  • Res_png_9patchAndroid版本之间的结构(字节块进入)似乎没有区别(请参阅http://code.metager.de/source/xref/android),因此看起来不像原因.

  • 关于九个补丁绘图的其他答案表明每个区域(尤其是可拉伸的区域)应该至少为2x2像素(如果不是3x3),但在更小的区域之外更好.

  • 但是,分配一些字节块的方式看起来可以更新.尝试将第4个字节设置为9(我认为补丁的数量),NO_COLOR在末尾再添加7个s并将其大小调整为56 +(7 x 4)= 84个字节