Tôi đang tạo bản đồ đẳng bằng các ô đơn giản và tôi ’ đã mở rộng RelativeLayout
để tạo bố cục chứa các ô này. Thực sự, chỉ cần sử dụng một số RelativeLayout
as-được làm việc tốt miễn là định hướng của tôi khớp với thứ tự mà các lát được ghi vào tệp XML; tất cả tôi ’ đã ghi đè là các nhà xây dựng, nơi tôi chỉ cần gọi super
và setChildrenDrawingOrderEnabled(true);
cùng với việc thiết lập một số biến (chiều cao và chiều rộng của lưới), và sau đó getChildDrawingOrder
chính nó.getChildDrawingOrder được gọi/sử dụng không đúng?
Mã của tôi cho getChildDrawingOrder
số liệu ra các chỉ số mới cho đứa trẻ nào đó, và cũng có thể đặt ra một chuỗi trong con để i->i'
, nơi i
là chỉ số gốc và i'
là chỉ số mới. Tôi ’ m bằng cách này để thử nghiệm; trẻ em được thiết lập để vẽ chuỗi này trên bản thân cùng với tọa độ của chúng.
Thật không may, nó không hoạt động chính xác, hoặc đúng hơn là nó hoạt động không chính xác. Trong số 9 ô trong trường hợp thử nghiệm của tôi, có ba số là ’ t dường như có getChildDrawingOrder
gọi là: chuỗi tôi đã đề cập ở trên là null
. Trong số còn lại, ít nhất một được rút ra khỏi trật tự mặc dù nhận được chỉ số chính xác thông qua nó.
Đây ’ sa hình ảnh (trong định hướng TOP
):
Chú ý rằng (0,2), (1,2), và (2,1) đều được liệt kê như NULL
, và do đó, getChildDrawingOrder
dường như chưa bao giờ được gọi cho họ. Cũng lưu ý rằng (1,0) được vẽ trên đầu (1,1), mặc dù cả hai số i
(3) và i'
(1) nhỏ hơn (1,1) ’ s (4 và 4 tương ứng).
Đây ’ là mã từ 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;
}
}
bất cứ ai có thể làm sáng tỏ về những gì ’ đang xảy ra? Tại sao isn ’ t getChildDrawingOrder
được gọi cho ba loại gạch đó? Tại sao (1.0) được vẽ theo thứ tự sai, mặc dù getChildDrawingOrder
là được gọi?
Tôi cảm thấy như thế này cần thêm một chút giới thiệu. Tôi đã đi từ phát triển Android trong nhiều năm, vì vậy tôi sẽ phải đào một chút để có được vào mã này và hiểu những gì nó đã làm. Nếu không làm điều đó, tôi thậm chí không thể nói đây có phải là câu trả lời hay không. Giải thích thêm về 'getChildDrawingOrder' và cách nó hoạt động/cách nó được sử dụng sẽ giúp ích gì với điều đó, tôi nghĩ vậy. – KRyan
Tôi sẽ thêm một số hình ảnh để minh họa – petey