我正在用簡單的瓷磚創建等軸測圖,並且我擴展了RelativeLayout
以創建一個包含這些瓷磚的佈局。真的,只要使用RelativeLayout
as-is工作正常,只要我的方向與磁貼寫入XML文件的順序相匹配;所有我’ ve被覆蓋的構造函數,我簡單地調用super
和setChildrenDrawingOrderEnabled(true);
以及設置一些變量(網格的高度和寬度),然後getChildDrawingOrder
本身。getChildDrawingOrder調用/使用不規律?
我對getChildDrawingOrder
數字出新的指數給定的子碼,並且還設置在孩子i->i'
,其中i
是原來的指數,i'
是新指數的字符串。 I ’ m用於測試;孩子們可以將自己的字符串和他們的座標一起畫出來。
不幸的是,它不能正常工作,或者說它工作不正常。在我測試用例中的九塊瓷磚中,三塊瓷磚似乎都有getChildDrawingOrder
:上面提到的字符串是null
。其餘的是,儘管得到正確的索引,但其中至少有一個正在被排除在外。
這裏’ SA圖片(在TOP
取向):
注意,(0,2),(1,2),和(2,1)都被列爲NULL
,因此getChildDrawingOrder
似乎從未被他們要求。還要注意(1,0)在(1,1)之上繪製,即使它的i
(3)和i'
(1)都小於(1,1)’(分別爲4和4)。
這裏’■從getChildDrawingOrder
代碼:
@Override
protected int getChildDrawingOrder(int childCount, int i)
{
TileView ch = (TileView)getChildAt(i);
ch.order = "Called"; // this string is drawn on my children
int gx, gy; // the "true" x,y for the current rotation,
// where 0,0 is the top corner
switch (rotation)
{
case TOP:
gx = ch.x();
gy = ch.y();
break;
case LEFT:
gx = (width()-1-ch.x());
gy = ch.y();
break;
case RIGHT:
gx = ch.x();
gy = (length()-1-ch.y());
break;
case BOTTOM:
gx = (width()-1-ch.x());
gy = (length()-1-ch.y());
break;
default:
gx = ch.x();
gy = ch.y();
}
int row = gx+gy; // current row
if (row == 0) // row 0 is always just the top corner and 0
{
ch.order = new String(i+"->0"); // string set to i->i'
return 0;
}
else
{
int mx = width()-1, // maximum x value
my = length()-1, // maximum y value
mrow = mx+my, // maximum row
min = Math.min(mx, my), // minor axis length
maj = Math.max(mx, my), // major axis length
retn; // for storing the return value
// inside the top corner
if (row <= min)
{
// Gauss's formula to get number of cells in previous rows
// plus the number for which cell in this row this is.
retn = row*(row+1)/2+gy;
}
// in the middle
else if (row <= maj)
{
// Gauss's formula to get number of cells in top corner
// plus the number of cells in previous rows of the middle section
// plus the number for which cell in this row this is.
retn = min*(min+1)/2+min*(row-min)+gy;
}
// bottom corner
else
{
retn = (min+1)*(min+2)/2 // cells in the top corner
+ min*(maj-min) // cells in the middle
+ (mrow-maj)*(mrow-maj+1)/2 // total cells in bottom triangle
- (mrow-row+1)*(mrow-row+2)/2 // less cells after this one
+ gy // which cell in this row
- (row-maj) // to account for gy not starting at zero
;
}
ch.order = new String(i+"->"+retn); // string set to i->i'
return retn;
}
}
任何人都可以擺脫什麼’事了一些輕?爲什麼要爲這三個瓷磚調用?’ t getChildDrawingOrder
?爲什麼(1,0)以錯誤的順序繪製,即使getChildDrawingOrder
是被調用?
我覺得這需要多一點介紹。我已經離開了Android開發多年,所以我不得不深入瞭解這些代碼並理解它在做什麼。如果不這樣做,我甚至無法分辨這是否是一個好的答案。我想,有關'getChildDrawingOrder'的更多解釋以及它的工作方式/使用方法將對此有所幫助。 – KRyan
我會添加一些圖像來說明 – petey