2013-07-01 125 views
1

我有我自己的視圖子類,佈局(我稱之爲ViewGallery),我的問題是,我手動繪製的視圖不會出現在屏幕上,這裏是onDraw方法。繪製子視圖

@Override 
protected void onDraw(Canvas canvas) { 
    for(Child child : visibleChilds){ 
     canvas.save(); 
     canvas.clipRect(child.bounds); 
     child.view.draw(canvas); 
     canvas.restore(); 
    } 
} 

private List<Child> visibleChilds = new ArrayList<ViewGallery.Child>(); 

private static class Child { 
    private View view; 
    private Rect bounds; 

    public Child(View view, Rect rect) { 
     this.view = view; 
     bounds = rect; 
    } 
} 

據我所知,應該在指定的剪切Canvas中繪製內部視圖。

爲什麼視圖仍然是空的?

此外,我試圖擴展ViewGroup,所以我將自己作爲參數傳遞給適配器,但默認ViewGroup.LayoutParams沒有留下(或x)屬性,我需要妥善處理視圖的轉換。但是,在繼承onDraw時,onDraw永遠不會被調用,孩子仍然不會出現。

+0

您需要重寫dispatchDraw()來繪製子元素,而不是onDraw()。你可以從onDraw()做到,但你首先需要調用setWillNotDraw(false)。您還應該使用ViewGroup.drawChild()來正確繪製每個孩子。 –

+0

有沒有dispatchDraw重寫在ViewGroup,我試圖使用setWillNotDraw方法。另外,我需要知道ViewGroup是否會處理addViews,還是我應該重寫它呢? –

+0

是的,有一個dispatchDraw()方法:http://developer.android.com/reference/android/view/ViewGroup.html#dispatchDraw(android.graphics.Canvas) –

回答

0

我不確定我是否正確理解問題。 但是,如果您試圖在畫布上繪製視圖,則必須啓用圖形緩存,從中獲取位圖並繪製該圖。

例如:

  // you have to enable setDrawingCacheEnabled, or the getDrawingCache will return null 
      view.setDrawingCacheEnabled(true); 

      // we need to setup how big the view should be..which is exactly as big as the canvas 
      view.measure(MeasureSpec.makeMeasureSpec(canvas.getWidth(), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(canvas.getHeight(), MeasureSpec.AT_MOST)); 
      // assign the layout values to the textview 
      view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); 


      mBitmap = view.getDrawingCache(); 
      canvas.drawBitmap(mBitmap, x, y, mPaint); 
      // disable drawing cache 
      view.setDrawingCacheEnabled(false); 

Ofcourse在這種情況下它會只是在給定的位置繪製的視圖的位圖。