Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 对于xml drawable中定义的形状,BitmapFactory.decodeResource()返回null_Android_Android Drawable_Xml Drawable - Fatal编程技术网

Android 对于xml drawable中定义的形状,BitmapFactory.decodeResource()返回null

Android 对于xml drawable中定义的形状,BitmapFactory.decodeResource()返回null,android,android-drawable,xml-drawable,Android,Android Drawable,Xml Drawable,我浏览了许多类似的问题,尽管我还没有找到我的问题的正确答案 我有一个可绘制的,在shape.xml中定义的 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <so

我浏览了许多类似的问题,尽管我还没有找到我的问题的正确答案

我有一个可绘制的,在shape.xml中定义的

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >

    <solid android:color="@color/bg_color" />
</shape>

我做错了什么?
BitmapFactory.decodeResource()
是否适用于xml定义的可绘制文件?

由于您希望加载的是可绘制文件而不是位图,请使用以下方法:

Drawable d = getResources().getDrawable(R.drawable.your_drawable, your_app_theme);
要将其转换为
位图

public static Bitmap drawableToBitmap (Drawable drawable) {

    if (drawable instanceof BitmapDrawable) {
        return ((BitmapDrawable)drawable).getBitmap();
    }

    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap); 
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);

    return bitmap;
}

摘自:

它是可绘制的,不是位图。您应该使用
getDrawable
来代替您可能已经将
.xml
放入目录:…
/drawable-24
,并尝试将其放入…
/drawable

public static Bitmap convertDrawableResToBitmap(@DrawableRes int drawableId, Integer width, Integer height) {
    Drawable d = getResources().getDrawable(drawableId);

    if (d instanceof BitmapDrawable) {
        return ((BitmapDrawable) d).getBitmap();
    }

    if (d instanceof GradientDrawable) {
        GradientDrawable g = (GradientDrawable) d;

        int w = d.getIntrinsicWidth() > 0 ? d.getIntrinsicWidth() : width;
        int h = d.getIntrinsicHeight() > 0 ? d.getIntrinsicHeight() : height;

        Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        g.setBounds(0, 0, w, h);
        g.setStroke(1, Color.BLACK);
        g.setFilterBitmap(true);
        g.draw(canvas);
        return bitmap;
    }

    Bitmap bit = BitmapFactory.decodeResource(getResources(), drawableId);
    return bit.copy(Bitmap.Config.ARGB_8888, true);
}

//------------------------

Bitmap b = convertDrawableResToBitmap(R.drawable.myDraw , 50, 50);

它对我有用,希望这能帮助别人。

我想知道这是怎么回事。。。由于可绘制图形是在XML中定义的形状,
getIntrinsicWidth()
getIntrinsicHeight()
将始终返回-1,并且不会创建位图。或者我搞错了什么?这会抛出
IllegalArgumentException:width和height必须>0
,这意味着您的可绘制文件没有有效的大小。使用新的支持库更新:使用ContextCompat.GetDrawable(context,id)Drawable类的Koltin扩展:您不能在StateListDrawable或Shapead上使用
getDrawable
,并对您的答案进行解释
public static Bitmap convertDrawableResToBitmap(@DrawableRes int drawableId, Integer width, Integer height) {
    Drawable d = getResources().getDrawable(drawableId);

    if (d instanceof BitmapDrawable) {
        return ((BitmapDrawable) d).getBitmap();
    }

    if (d instanceof GradientDrawable) {
        GradientDrawable g = (GradientDrawable) d;

        int w = d.getIntrinsicWidth() > 0 ? d.getIntrinsicWidth() : width;
        int h = d.getIntrinsicHeight() > 0 ? d.getIntrinsicHeight() : height;

        Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        g.setBounds(0, 0, w, h);
        g.setStroke(1, Color.BLACK);
        g.setFilterBitmap(true);
        g.draw(canvas);
        return bitmap;
    }

    Bitmap bit = BitmapFactory.decodeResource(getResources(), drawableId);
    return bit.copy(Bitmap.Config.ARGB_8888, true);
}

//------------------------

Bitmap b = convertDrawableResToBitmap(R.drawable.myDraw , 50, 50);