2013-05-16 37 views
2

我們遇到了從特定視圖生成位圖的問題。限制是它不能渲染視圖(繪圖)。有沒有人有任何提示如何解決這個問題?Android:在不繪製的情況下生成視圖的位圖

類視圖文檔(http://developer.android.com/reference/android/view/View.html)對Android使用的渲染視圖的步驟有一些解釋。在這種情況下,我們會在步驟「佈局」中進行,而不是在「繪圖」中。任何有想法的人都可以舉個例子嗎?

我的代碼生成異常: 錯誤 - >寬度和高度必須> 0

... 
public static Bitmap loadBitmapFromView(View v) { 
    Bitmap b = null; 
    try { 
     b = Bitmap.createBitmap(
       v.getWidth(), 
       v.getHeight(), 
       Bitmap.Config.ARGB_8888);     
     Canvas c = new Canvas(b); 
     v.measure(v.getWidth(), v.getHeight()); 
     v.layout(0, 0, v.getWidth(), v.getHeight()); 
     v.draw(c); 

    } catch (Exception e) { 

     Log.e(MainActivity.TAG, "error -> "+e.getMessage()); 
    } 



    return b; 
} 


public void snap(View v) { 


    LayoutInflater inflate = (LayoutInflater) getBaseContext() 
      .getSystemService(LAYOUT_INFLATER_SERVICE); 
    View view = new View(getBaseContext()); 
    view = inflate.inflate(R.layout.list_item, null); 


    Log.d(MainActivity.TAG, "getWidth -> "+view.getWidth()); 
    Log.d(MainActivity.TAG, "getHeight -> "+view.getHeight()); 

    Bitmap b = loadBitmapFromView(view); 
    if (b != null) { 

     LinearLayout mainLayout = (LinearLayout) findViewById(R.id.LinearLayout1); 
     ImageView image = new ImageView(this); 
     image.setImageBitmap(b); 

     mainLayout.addView(image); 
    } 


} 
+0

我真的不明白你想要達到的目標。但在'onMeasure'步驟之前,視圖不會有大小。所以,只是膨脹視圖不會伎倆。 –

+0

您可以從視圖中生成位圖而不繪製它?我想生成一個圖像(位圖)到一個未在屏幕上繪製的視圖。這個想法是生成多個位圖圖像並僅在需要時顯示。 –

回答

8

我找到了解決辦法是這樣的:

public static Bitmap getScreenViewBitmap(final View v) { 
    v.setDrawingCacheEnabled(true); 

    v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
      MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
    v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); 

    v.buildDrawingCache(true); 
    Bitmap b = Bitmap.createBitmap(v.getDrawingCache()); 
    v.setDrawingCacheEnabled(false); // clear drawing cache 

    return b; 
} 
1

你立即試圖讓通脹後視圖的寬度和高度,但沒有按查看在佈置完成之後纔有大小。您可以自己確定一個尺寸(請致電measure(),無論MeasureSpec是否合適),或者將其作爲佈局的一部分,設置爲不可見,並且只在佈局完成後嘗試從視圖中加載位圖。

+0

嗨kcoppock,你的建議就像這樣的討論:http://stackoverflow.com/questions/4393612/when-can-i-first-measure-a-view? –

+1

對,你可以添加一個onGlobalLayout監聽器,但是這個視圖必須是佈局的一部分。你的步驟應該工作,問題是你不能依賴getWidth()和getHeight()在當前時間。如果你在那裏硬編碼值,它應該可以工作。在這種情況下,您需要硬編碼值,或者自己測量視圖以獲取適當的尺寸。 – kcoppock

相關問題