我有一个业务需要在运行时创建 NinePatchDrawable 对象,即从服务器接收外部 .png 图像,并且必须将其作为九个补丁应用到按钮的背景中(例如)。
我试图创建 NinePatchDrawable 对象,但构造函数要求我提供一个描述补丁的“byte[] chunck”。问题是,我不知道如何从其中没有 9patch 信息的位图构建这个块。
关于这个话题的任何想法?我是否从错误的角度看待问题?
我有一个业务需要在运行时创建 NinePatchDrawable 对象,即从服务器接收外部 .png 图像,并且必须将其作为九个补丁应用到按钮的背景中(例如)。
我试图创建 NinePatchDrawable 对象,但构造函数要求我提供一个描述补丁的“byte[] chunck”。问题是,我不知道如何从其中没有 9patch 信息的位图构建这个块。
关于这个话题的任何想法?我是否从错误的角度看待问题?
请参阅我对在运行时创建 NinePatch/NinePatchDrawable 的回答
我开发了一个工具来从(未编译的)NinePatch 位图创建 NinePatchDrawable。请参阅https://gist.github.com/knight9999/86bec38071a9e0a781ee。
该方法
NinePatchDrawable createNinePatchDrawable(Resources res, Bitmap bitmap)
可以帮助您。
例如,
ImageView imageView = (ImageView) findViewById(R.id.imageview);
Bitmap bitmap = loadBitmapAsset("my_nine_patch_image.9.png", this);
NinePatchDrawable drawable = NinePatchBitmapFactory.createNinePatchDrawable(getResources(), bitmap);
imageView.setBackground( drawable );
在哪里
public static final Bitmap loadBitmapAsset(String fileName,Context context) {
final AssetManager assetManager = context.getAssets();
BufferedInputStream bis = null;
try {
bis = new BufferedInputStream(assetManager.open(fileName));
return BitmapFactory.decodeStream(bis);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bis.close();
} catch (Exception e) {
}
}
return null;
}
在这种情况下,它my_nine_patch_image.9.png
位于资产目录下。
我已经在问题 5519768中回答了这个问题。请记住“源”和“编译”九补丁图像之间的区别。