2012-01-11 108 views
1

我嘗試通過膨脹佈局來創建View programaticaly。創建視圖的位圖

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)無任何變化。 位圖看起來像填充的佈局。 現在的問題:如果我把東西放到視圖中,使得視圖的寬度或高度比顯示尺寸大(例如:帶有長文本的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) – 2012-01-11 11:52:45

+0

哼?答案在哪裏?有一個答案,但它現在消失了?! – Informatic0re 2012-01-11 13:19:59

+0

檢查我給出的鏈接。 – 2012-01-11 14:25:13

回答

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));。第一個參數是顯示寬度或heigt,第二個參數是模式AT_MOST,這是「包裝」視圖所需的。

很好用! (對我來說:p)