2012-01-11 3 views
1

Я пытаюсь создать программный вид View, раздувая макет.Создание растрового изображения зрения

View marker = ((LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.overlay_view, null); 

Теперь я хочу, чтобы преобразовать этот взгляд в растр

public static Bitmap createDrawableFromView(Context context, View view){ 
     DisplayMetrics displayMetrics = new DisplayMetrics(); 
     ((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); 

     view.measure(displayMetrics.widthPixels, displayMetrics.heightPixels); 
     view.layout(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels); 

     Bitmap cache = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888); 

     Canvas canvas = new Canvas(cache); 
     view.draw(canvas); 

     return cache; 
    } 

Я также попытался меру (1, 1) и расположение (0, 0, 0, 0) без каких-либо изменений. Растровое изображение выглядит как заполненный макет. Теперь проблема: если я что-то помещаю в представление, которое делает вид больше, чем Displaysize по ширине или высоте (например: TextView с длинным текстом), битмап также больше. Ширина и высота представления XML - WRAP_CONTENT, но она не работает. Я никогда не помещал это представление куда-нибудь, чтобы отобразить его (потому что мне нужно только битмап).

Вопрос: Как я могу WRAP просмотреть максимум ширины = displayWidth?

Я попробовал view.setLayoutParams (новый LayoutParam (100, 100)), но он также был больше 100! Я действительно не понимаю, что произошло, когда я раздувал макет и задавал содержимое представления.

View.getMeasuredWidth и Height всегда больше моего дисплея ?! (Если я ставлю в нем что-то большее)

Вот пример компоновки:

<RelativeLayout android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/somedrawable" 
     android:padding="10dp" 
     android:clickable="true"> 
     <TextView android:id="@+id/name" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Name"/> 
     <TextView android:id="@+id/description" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/name" 
      android:text="Description" 
      android:textSize="20dp" 
      android:textColor="#ffffff"/> 
    </RelativeLayout> 
+0

[Проверить этот ответ] (http://stackoverflow.com/questions/8294110/taking-screenshot/8366223#8366223) –

+0

гул? Где ответ? Был ответ, но он ушел сейчас ?! – Informatic0re

+0

проверьте ссылку, которую я дал. –

ответ

0

Я нашел решение:

первый шаг: добавить новые LayoutParams к виду. Это важно, потому что вы не получите NullPointer.

view.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

Второе:

view.measure(MeasureSpec.makeMeasureSpec(displayMetrics.widthPixels), MeasureSpec.AT_MOST), 
      MeasureSpec.makeMeasureSpec(displayMetrics.heightPixels, MeasureSpec.AT_MOST)); 

для view.measure() я использовал MeasureSpec.makeMeasureSpec(displayMetrics.heightPixels, MeasureSpec.AT_MOST));. Первый параметр - ширина или высота экрана, а второй - режим AT_MOST, это необходимо для «обертки» представления.

Отлично работает! (для меня: p)

Смежные вопросы