我一直在旋轉我的輪子,試圖瞭解爲什麼我的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)處繪製,繪畫將出現在視圖的原點,而不是屏幕的原點。
所以這個形象是我所看到的一個例子。底部的紅色區域是不被drawBitmap繪製的子視圖的一部分。
任何想法我在這裏做錯了嗎?如果視圖是全屏的話,所有東西都能很好地繪製,但是使用ActionBar時,我沒有給出包含ActionBar大小的座標,所以我似乎正在繪製它。
謝謝,羅曼。我現在重寫了我的代碼,以確保不會刪除原始矩陣,而是將適當的比例和平移添加到現有矩陣。這絕對解決了我的問題。 – Thorinside 2011-12-14 05:19:04