2011-12-13 79 views
0

我一直在旋轉我的輪子,試圖瞭解爲什麼我的ViewGroup實現自從我開始嘗試向我的活動添加一個ActionBar以來一直出現故障。當屏幕上有一個ActionBar時,爲什麼ViewGroup不能正確繪製?

我有一個自定義的ViewGroup,它根據與視圖的當前寬度和高度相關的比率來繪製一組視圖。 ViewGroup實現了一種有點像絕對佈局的佈局算法,但它不是絕對座標,而是取決於ViewGroup的寬度和高度。

我幾乎忽略了佈局的onMeasure傳遞,因爲我只是告訴子視圖他們的尺寸是多少。

的onLayout做類似以下內容:

@Override 
protected void onLayout(boolean changed, int left, int top, int right, int bottom) 
{ 
    if (isInEditMode()) return; 

    int height = getHeight(); 
    int width = getWidth(); 

    for (int i = 0; i < getChildCount(); i++) 
    { 
     View child = getChildAt(i); 
     ImageCell cell = cells.get(i); 

     int l = (int)(cell.getX0() * width); 
     int t = (int)(height - (cell.getY1() * height)); 
     int r = (int)(cell.getX1() * width); 
     int b = (int)(height - (cell.getY0() * height)); 

     child.layout(l, t, r, b); 

     child.setBackgroundColor(0xFFFF0000); 
    } 
} 

不幸被設置爲我定製的ViewGroup不用油漆本身正常的孩子的意見。這些視圖是簡單的位圖繪圖視圖,但位圖可能會應用縮放和平移。我查看的onDraw()被寫入類似以下內容:

@Override 
public void onDraw(Canvas canvas) 
{ 

    if (canvasMatrix == null) 
    { 
     canvasMatrix = new Matrix(); 
    } 

    canvasMatrix.reset(); 
    canvasMatrix.setScale(scaleX, scaleY); 
    canvasMatrix.postTranslate(getLeft() + translationX, getTop() + translationY); 
    canvas.setMatrix(canvasMatrix); 

    synchronized (renderBuffer) 
    { 
     /** 
     * We need to offset the renderBuffer, the scaling is done by the matrix 
     * on the canvas. 
     */ 

     canvas.drawBitmap(renderBuffer, offsetX, offsetY, null); 

    } 
} 

我設立,將應用縮放和平移,以根據需要顯示的圖像的縮放和平移畫布矩陣。然後用指定的x和y偏移量在畫布上繪製圖像。

似乎在發生的事情是,位圖被繪製在ActionBar下方,在屏幕底部留下大量空間,並且未被繪製。如果我添加一個常數係數來抵消Y,則可以使位圖在屏幕上的正確位置上繪製(取決於設備的旋轉)。但我不確定這個常數因子應該在哪裏計算。

我對Android繪圖瞭解甚少。我希望Canvas能夠相對於視圖在屏幕上的位置,這樣如果我在(0,0)處繪製,繪畫將出現在視圖的原點,而不是屏幕的原點。

Strange Painting Issue Example

所以這個形象是我所看到的一個例子。底部的紅色區域是不被drawBitmap繪製的子視圖的一部分。

任何想法我在這裏做錯了嗎?如果視圖是全屏的話,所有東西都能很好地繪製,但是使用ActionBar時,我沒有給出包含ActionBar大小的座標,所以我似乎正在繪製它。

回答

1

你的問題在這裏:canvas.setMatrix(canvasMatrix);

通過調用此方法可以打開應用於畫布的整個變換。整個窗口只有一個Canvas,因此您將刪除應用於由ActionBar高度偏移的變換。

你也應該總是在視圖上調用measure()。某些視圖期望此調用正常工作。

+0

謝謝,羅曼。我現在重寫了我的代碼,以確保不會刪除原始矩陣,而是將適當的比例和平移添加到現有矩陣。這絕對解決了我的問題。 – Thorinside 2011-12-14 05:19:04

相關問題