如何从安卓默认资源中获取位图?

9

嗨,我正在使用这种方式进行操作。

Bitmap bm = BitmapFactory.decodeResource(getResources(), android.R.drawable.list_selector_background);

int c = bm.getPixel(bm.getWidth()/2, bm.getHeight()/2);

但是bm为null,导致第二行代码抛出NullPointerException异常。

错误:

02-12 18:29:57.568: E/AndroidRuntime(5086):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
02-12 18:29:57.568: E/AndroidRuntime(5086):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
02-12 18:29:57.568: E/AndroidRuntime(5086):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-12 18:29:57.568: E/AndroidRuntime(5086):     at android.os.Looper.loop(Looper.java:137)
02-12 18:29:57.568: E/AndroidRuntime(5086):     at android.app.ActivityThread.main(ActivityThread.java:4424)
02-12 18:29:57.568: E/AndroidRuntime(5086):     at java.lang.reflect.Method.invokeNative(Native Method)
02-12 18:29:57.568: E/AndroidRuntime(5086):     at java.lang.reflect.Method.invoke(Method.java:511)
02-12 18:29:57.568: E/AndroidRuntime(5086):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-12 18:29:57.568: E/AndroidRuntime(5086):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-12 18:29:57.568: E/AndroidRuntime(5086):     at dalvik.system.NativeStart.main(Native Method)
02-12 18:29:57.568: E/AndroidRuntime(5086): Caused by: java.lang.NullPointerException
02-12 18:29:57.568: E/AndroidRuntime(5086):     at com.example.showhide.MainActivity.onCreate(MainActivity.java:38)
02-12 18:29:57.568: E/AndroidRuntime(5086):     at android.app.Activity.performCreate(Activity.java:4465)
02-12 18:29:57.568: E/AndroidRuntime(5086):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
02-12 18:29:57.568: E/AndroidRuntime(5086):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
3个回答

7

这是因为此资源是一个StateListDrawable,而不是一个Bitmap。您应该使用:

 Drawable d = getResources().getDrawable(android.R.drawable.list_selector_background);

如果您确定它是位图,请将可绘制对象强制转换为BitmapDrawable,并从中获取位图:

Drawable currentState = d.getCurrent();
if(currentState instanceof BitmapDrawable)
    Bitmap b = ((BitmapDrawable)currentState).getBitmap();

位图也可能为空。

你能告诉我,如何获取StateListDrawable中的所有drawable?因为使用getState()方法时,我总是得到一个大小为0的int[]数组。 - Jignesh Ansodariya
1
要获取特定状态的可绘制对象,请使用此StateListDrawable上的getStateDrawableIndex和getStateDrawable。 getState返回当前应用于此StateListDrawable的状态列表。请参见:链接 - Zielony
那么你如何从这个中获取 Bitmap - IgorGanapolsky
一般情况下不需要。底层的可绘制对象可以是形状、颜色、向量等,很少会是位图。 - Zielony

4
你应该使用Resources.getSystem()而不是getResources
Bitmap bm = BitmapFactory.decodeResource(Resources.getSystem(), android.R.drawable.list_selector_background);

因为您试图访问的资源不在您自己的资源中,而是在系统资源中。
编辑:
在错误的资源旁边,您正试图从一个选择器资源(xml文件)中获取可绘制对象。请获取正确的可绘制资源 :) http://androidxref.com/4.1.1/xref/frameworks/base/core/res/res/drawable/list_selector_background.xml

@lon Aalbers,非常感谢你的帮助,但是你能告诉我如何获取所有在StateListDrawable中的drawable吗?因为使用getState()方法总是返回一个大小为0的int[]。 - Jignesh Ansodariya

4

不使用BitmapFactory:

Bitmap bmp = ((BitmapDrawable) context.getResources()
             .getDrawable(R.drawable.list_selector_background)).getBitmap();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接