2016-12-12 13 views
1

Я пытаюсь преобразовать layer-list в bitmap, а затем установить этот bitmap как фон для ImageView, но он не работаетПреобразовать слой-лист к растровым не работает, вероятно

Это тестовый проект. Я знаю, что я могу установить вытяжку непосредственно ImageView, но я хочу знать, почему, когда я конвертировать LayerDrawable в Bitmap затем преобразовать Bitmap в BitmapDrawable затем установить его в качестве фона ImageView, он будет выглядеть по-другому
Вот мой слой-лист (ic_circle .xml)

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" 
    > 
    <item> 
     <shape 
      android:shape="oval"> 
      <solid android:color="#f00"></solid> 

     </shape> 
    </item> 
    <item 
     android:bottom="3dp" android:left="3dp" android:right="3dp" android:top="3dp"> 
     <shape 
      android:shape="oval"> 
      <solid android:color="#ff0"></solid> 

     </shape> 
    </item> 
    <item 
     android:bottom="6dp" android:left="6dp" android:right="6dp" android:top="6dp"> 
     <shape 
      android:shape="oval"> 
      <solid android:color="#0ff"></solid> 
     </shape> 
    </item> 
</layer-list> 

код активности

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ImageView img = (ImageView) findViewById(R.id.img); 
     Bitmap bm = drawableToBitmap(ContextCompat.getDrawable(this, R.drawable.ic_circle)); 
     img.setBackground(new BitmapDrawable(bm)); 
    } 

    public Bitmap drawableToBitmap (Drawable drawable) { 
     int width = drawable.getIntrinsicWidth(); 
     width = width > 0 ? width : 1; 
     int height = drawable.getIntrinsicHeight(); 
     height = height > 0 ? height : 1; 

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

     return bitmap; 
    } 
} 

Xml код

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    > 

    <ImageView 
     android:layout_width="80dp" 
     android:layout_height="80dp" 
     android:background="@drawable/ic_circle" 
     /> 


    <ImageView 
     android:id="@+id/img" 
     android:layout_marginTop="40dp" 
     android:layout_width="80dp" 
     android:layout_height="80dp" 
     /> 

</LinearLayout> 

В эмуляторе, вы увидите второе изображение отличается от первого изображения

enter image description here

+0

'Я пытаюсь преобразовать слой-список в растровое изображение, а затем установить это растровое изображение в качестве фона для ImageView'. Это не имеет для меня никакого смысла. Помните, почему ** вы хотите? Я имею в виду, почему бы не использовать список слоев напрямую и не сэкономить драгоценные машинные циклы? –

+0

@Rotwang это всего лишь тест, у меня есть проблема с преобразованием слоя-списка в растровое изображение, поэтому я создаю этот проект –

+1

, почему вы хотите его преобразовать в растровое изображение. Вы можете напрямую установить доступный для просмотра изображения. – Meenal

ответ

2

В вашем Drawable у вас есть вы определили только границы 2 внешних кружочков (желтых и красных), и синий должен принять все остальное пространство. Но так как он не имеет определенного размера, как только вы нарисуете его на холсте, размер будет равен 0.

Вы также должны определить его размер, если хотите нарисовать его непосредственно на растровом изображении.