我正在创建一个带有简单图块的等距地图,并且我已经扩展RelativeLayout
以创建一个包含这些图块的布局。真的,RelativeLayout
只要我的方向与将图块写入 XML 文件的顺序相匹配,就可以正常使用原样;我所覆盖的只是构造函数,我只是在其中调用super
并setChildrenDrawingOrderEnabled(true);
设置一些变量(网格的高度和宽度),然后是getChildDrawingOrder
它本身。
我的代码用于getChildDrawingOrder
计算给定子项的新索引,并将子项中的字符串设置为i->i'
,其中i
是原始索引,i'
是新索引。我正在使用它进行测试;孩子们被设置为在他们自己身上绘制这个字符串以及他们的坐标。
不幸的是,它不能正常工作,或者说它工作不规律。在我的测试用例中的九个图块中,三个似乎根本没有getChildDrawingOrder
调用:我上面提到的字符串是null
. 在其余部分中,尽管传递了正确的索引,但至少有一个被乱序绘制。
这是一张图片(在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;
}
}
任何人都可以阐明发生了什么吗?为什么不getChildDrawingOrder
调用这三块瓷砖?为什么 (1,0) 以错误的顺序绘制,即使它getChildDrawingOrder
被调用?