我使用下面的代码实例化 9patch 图像并将其设置为按钮的背景。下图显示了不理想的结果。
InputStream = MyClass.class.getResourceAsStream("/images/btn_default_normal.9.png");
Drawable d = NinePatchDrawable.createFromStream(in, null);
button.setBackgroundDrawable(d);
也尝试了下面的代码,这似乎会导致由 native android 代码引起的 ANR。目前还不清楚发生了什么,但应用程序在没有警告的情况下存在,日志显示了有关 ANR 的信息,并且我在日志中看到了很多以下堆栈跟踪。
InputStream = MyClass.class.getResourceAsStream("/images/btn_default_normal.9.png");
Bitmap bitmap = BitmapFactory.decodeStream(in);
byte[] chunk = bitmap.getNinePatchChunk();
NinePatchDrawable drawable = new NinePatchDrawable(bitmap, chunk, new Rect(), null);
button.setBackgroundDrawable(drawable);
at android.graphics.NinePatch.validateNinePathChunk(Native Method)
at android.graphics.NinePatch.<init>
at android.graphics.drawable.NinePatchDrawable.<init>
最佳答案
createFromStream()
方法是 Drawable 类(NinePatchDrawable 扩展)的一部分,因此它返回给您一个普通的 Drawable 对象,而不是一个 9-patch 。这就是为什么你的按钮看起来像我怀疑的那样。
您想要制作成 9-patch 的图像在哪里?从您的示例来看,它可能包含在您的应用程序资源中(也许在可绘制文件夹之一中?)如果是这种情况,是否有理由使用可绘制的 ID 不适用于您的情况?你应该能够做这样的事情:
button.setBackgroundResource(R.drawable.btn_default_normal);
如果我遗漏了某些东西(这肯定是可能的。)并且有一个原因导致您无法使用资源 ID。从文档看来,您的第二个代码块更接近您想要的内容。
但是您使用的构造函数已被弃用。 Try using this one instead.看起来像这样:
InputStream in = MyClass.class.getResourceAsStream("/images/btn_default_normal.9.png");
Bitmap bitmap = BitmapFactory.decodeStream(in);
byte[] chunk = bitmap.getNinePatchChunk();
NinePatchDrawable drawable = new NinePatchDrawable(getResources(), bitmap, chunk, new Rect(), null);
button.setBackgroundDrawable(drawable);
唯一的区别是第一个参数应该是您的应用程序资源对象。
但是,说实话,我可以发誓我在某个地方读到过系统无法将 NinePatchDrawables 作为对象动态使用。尽管 NinePatchDrawable 对象存在,但我的印象是它不起作用/不打算成为公共(public) API 的一部分
编辑:
这个问题的答案有帮助吗? Create a NinePatch/NinePatchDrawable in runtime
我在该问题底部的回答也准确地提醒了我为什么我的印象是它不起作用/不适用于部分公共(public) API docs for the getNinePatchChunk说
Returns an optional array of private data, used by the UI system for some bitmaps. Not intended to be called by applications.
但看起来他们还是设法让它发挥作用。
关于Android:如何从输入流创建 9patch 图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9284784/