建立在运行时9补丁绘制(Building a 9 patch drawable at runtime

2019-09-02 18:20发布

我成功地在运行在Android上构建9patch绘制3.0+使用由Brian格里菲(发现提供了出色的要点在这里 )。

基本上我从网络加载原始(没有补丁)的图形文件和文件名中包含我需要以便相应地缩放图像以使用帽插图。 然后我使用这些值与上面找到的类,并应用该图像作为背景的各种元件(如TextViewImageButtonButtonViewGroup ,等等)。

这完美的作品,你可以在这里看到:

但是,运行在Android 2.3.x版本相同的代码生成结果:

我已经通过在Android中用于分析一个9patch图像(源代码看上去这里和这里 ),但没有发现任何得到这个正常工作的方法。 我已经尝试过几乎一切我可以把一切都无济于事。

对于记录,所述9patch由每个轴上三列,一个固定,一个可拉伸的和一个固定的。

在这里我们希望别人之前已经解决了这个问题。

提前致谢。

编辑我只在Android 2.3及以上重复这种行为感兴趣(我本来2.X)。

编辑#2要领描述正是我试图做 +图片来源:

EDIT#3的图像的尺寸的22px / 58px(宽度/高度)和插图是14/6/14/6(顶部/左/底/右)。

Answer 1:

放在一起的所有至今我所发现,并磨练了一点:

  • 似乎没有要在差异Res_png_9patch结构的Android版本(见之间(该字节块进入) http://code.metager.de/source/xref/android ),这样就不会像的原因。

  • 大约九个补丁可绘制其他的答案表明,每个区域(尤其是伸展的)应该是至少2×2像素(如果不是3×3),但是那越小越好之外。

  • 然而,一些字节块的分配方式看起来可能被更新。 尝试设置到9(补丁的数量,我认为)的第4字节,增加7更NO_COLOR s到所述端部和移动它的大小高达56 +(7×4)= 84字节



Answer 2:

它的工作对我来说我更新的代码之后。 我觉得颜色尺寸使得它不高兴出于某种原因(基于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;
}


Answer 3:

看起来像9patches工作在深度,已经描述的- 在运行时创建NinePatch / NinePatchDrawable



Answer 4:

不是一个真正的问题的答案,但一个有用的解决办法...

我总是发现有9补丁文件的工作在运行时有毛。 我已经能够成功地使用文字FrameLayouts并自动调整大小来完成我想要的效果。 如果您的应用程序将只使用这9补丁,并没有特别允许用户下载它作为一个图像(一个Android的9补丁图像生成,可以这么说),我会建议你考虑这样做。



文章来源: Building a 9 patch drawable at runtime