以编程方式设置NinePatch背景

时间:2014-02-08 10:35:37

标签: android nine-patch

当我尝试以编程方式使用9patch背景时,

它仅适用于:(场景1)'拉伸区域'(上/下)大于'内容填充区域'(下/右)

但是如果:(场景2)填充比拉伸更大 - 我得到这个错误:

02-08 10:32:04.203: E/AndroidRuntime(397): FATAL EXCEPTION: main
02-08 10:32:04.203: E/AndroidRuntime(397): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.game.test}: java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable
02-08 10:32:04.203: E/AndroidRuntime(397):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
02-08 10:32:04.203: E/AndroidRuntime(397):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
02-08 10:32:04.203: E/AndroidRuntime(397):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-08 10:32:04.203: E/AndroidRuntime(397):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-08 10:32:04.203: E/AndroidRuntime(397):  at android.os.Handler.dispatchMessage(Handler.java:99)
02-08 10:32:04.203: E/AndroidRuntime(397):  at android.os.Looper.loop(Looper.java:123)
02-08 10:32:04.203: E/AndroidRuntime(397):  at android.app.ActivityThread.main(ActivityThread.java:3683)
02-08 10:32:04.203: E/AndroidRuntime(397):  at java.lang.reflect.Method.invokeNative(Native Method)
02-08 10:32:04.203: E/AndroidRuntime(397):  at java.lang.reflect.Method.invoke(Method.java:507)
02-08 10:32:04.203: E/AndroidRuntime(397):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-08 10:32:04.203: E/AndroidRuntime(397):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-08 10:32:04.203: E/AndroidRuntime(397):  at dalvik.system.NativeStart.main(Native Method)
02-08 10:32:04.203: E/AndroidRuntime(397): Caused by: java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable
02-08 10:32:04.203: E/AndroidRuntime(397):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-08 10:32:04.203: E/AndroidRuntime(397):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)

任何人都知道如何解决方案2?

代码:

linLayout = new LinearLayout(this);
NinePatchDrawable ninep = (NinePatchDrawable)getResources().getDrawable(R.drawable.ninepatch_background) ;
linLayout.setBackground(ninep);

3 个答案:

答案 0 :(得分:2)

无需创建NinePatchDrawable对象。您只需使用setBackgroundResource(R.drawable.ninepatch_background)即可。我不知道这是不是问题,但我希望它有所帮助。

答案 1 :(得分:2)

试试这个。为我工作。

private Drawable displayNinePatch(String path, Context context) {
    Bitmap bitmap = BitmapFactory.decodeFile(path);
    byte[] chunk = bitmap.getNinePatchChunk();
    if(NinePatch.isNinePatchChunk(chunk)) {
        return new NinePatchDrawable(context.getResources(), bitmap, chunk, new Rect(), null);
    } else return new BitmapDrawable(bitmap);
}

为ImageView设置图像

  yourimageview.setBackgroundDrawable(displayNinePatch("/data/data/your.app/files/urnineimage.9.png", yourcontext));

答案 2 :(得分:1)

我最终做的是使用方案1 NinePatch(Stretch比Padding更大 - 我不想要)

并手动设置填充区域,使用以下代码:

NinePatchDrawable ninepatch;
Bitmap image = BitmapFactory.decodeResource(getResources(),R.drawable.ninepatch_background);
if (image.getNinePatchChunk()!=null){
    byte[] chunk = image.getNinePatchChunk();
    Rect paddingRectangle = new Rect(30, 0, 30, 50);
    ninepatch = new NinePatchDrawable(getResources(), image, chunk, paddingRectangle, null);
}
int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
    linLayout.setBackgroundDrawable(ninepatch);
} else {
    linLayout.setBackground(ninepatch);
}