2012-04-11 2 views
25

Как я могу получить растровое изображение из xml-формы. Что я делаю неправильно?Как получить растровое изображение из drawable, определенное в xml?

shadow.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle" > 

    <gradient 
     android:angle="270.0" 
     android:endColor="@android:color/transparent" 
     android:startColor="#33000000" 
     android:type="linear" /> 

    <size android:height="7.0dip" /> 

</shape> 

Моего метод для получения растрового изображения из вытяжки:

private Bitmap getBitmap(int id) { 
    return BitmapFactory.decodeResource(getContext().getResources(), id); 
} 

getBitmap() возвращает нуль, когда идентификатор передается в это shadow.xml допустимый идентификатор.

ответ

13

У ShapeDrawable нет связанного с ним растрового изображения - его единственная цель - рисовать на холсте. Пока не будет вызван метод его рисования, он не имеет изображения. Если вы можете получить элемент холста в том месте, где вам нужно нарисовать тень, вы можете нарисовать его как shapeDrawable, иначе вам может понадобиться отдельный пустой вид в вашем макете с тенью в качестве фона.

+0

благодарим вас за хорошее описание. Я нарисовал его прямо на холсте и отлично работал. – kaneda

+0

@kaneda вы можете показать код, который наконец-то сработал? Я столкнулся с той же проблемой здесь. Большое спасибо. –

+0

Это было бы что-то вроде строк 'Drawable d = getContext(). GetResources(). GetDrawable (R.drawable.id);' 'd.draw (canvas);' – Punksmurf

27

Это полностью рабочий раствор:

private Bitmap getBitmap(int drawableRes) { 
    Drawable drawable = getResources().getDrawable(drawableRes); 
    Canvas canvas = new Canvas(); 
    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); 
    canvas.setBitmap(bitmap); 
    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); 
    drawable.draw(canvas); 

    return bitmap; 
} 

И вот пример:

Bitmap drawableBitmap = getBitmap(R.drawable.circle_shape); 

circle_shape.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="oval"> 
    <size 
     android:width="15dp" 
     android:height="15dp" /> 
    <solid 
     android:color="#94f5b6" /> 
    <stroke 
     android:width="2dp" 
     android:color="#487b5a"/> 
</shape> 
+1

Это должен быть принятый ответ – blueware

+0

Он бросает java.lang.IllegalArgumentException: ширина и высота должны быть> 0 – BMU

+0

Просто небольшое обновление совместимости: измените «getResources(). GetDrawable (drawableRes);» «ContextCompat.getDrawable (контекст, drawableRes)»; – Tobliug

0

Вы должны добавить атрибут размера к твоей ша pe для предотвращения «java.lang.IllegalArgumentException: ширина и высота должны быть> 0».

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
     android:shape="oval"> 
     <solid android:color="@color/colorAccent" /> 
     <stroke 
      android:width="1.3dp" 
      android:color="@color/white" /> 

     <size android:height="24dp" android:width="24dp"/> 
</shape> 
Смежные вопросы