我成功地在运行在Android上构建9patch绘制3.0+使用由Brian格里菲(发现提供了出色的要点在这里 )。
基本上我从网络加载原始(没有补丁)的图形文件和文件名中包含我需要以便相应地缩放图像以使用帽插图。 然后我使用这些值与上面找到的类,并应用该图像作为背景的各种元件(如TextView
, ImageButton
, Button
, ViewGroup
,等等)。
这完美的作品,你可以在这里看到:
但是,运行在Android 2.3.x版本相同的代码生成结果:
我已经通过在Android中用于分析一个9patch图像(源代码看上去这里和这里 ),但没有发现任何得到这个正常工作的方法。 我已经尝试过几乎一切我可以把一切都无济于事。
对于记录,所述9patch由每个轴上三列,一个固定,一个可拉伸的和一个固定的。
在这里我们希望别人之前已经解决了这个问题。
提前致谢。
编辑我只在Android 2.3及以上重复这种行为感兴趣(我本来2.X)。
编辑#2要领描述正是我试图做 +图片来源:
EDIT#3的图像的尺寸的22px / 58px(宽度/高度)和插图是14/6/14/6(顶部/左/底/右)。
它的工作对我来说我更新的代码之后。 我觉得颜色尺寸使得它不高兴出于某种原因(基于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;
}
看起来像9patches工作在深度,已经描述的- 在运行时创建NinePatch / NinePatchDrawable
不是一个真正的问题的答案,但一个有用的解决办法...
我总是发现有9补丁文件的工作在运行时有毛。 我已经能够成功地使用文字FrameLayouts并自动调整大小来完成我想要的效果。 如果您的应用程序将只使用这9补丁,并没有特别允许用户下载它作为一个图像(一个Android的9补丁图像生成,可以这么说),我会建议你考虑这样做。