我制作的游戏中用户需要能够看到多种颜色的六边形网格(它们只是不同的图像),并且需要能够点击其中的一些(灰色的)。我现在使用TableLayout
制作了十六进制网格:
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
>
<TableRow
android:layout_marginTop="0dp"
android:layout_marginBottom="@dimen/margin_cell_vertical"
>
<ImageView android:src="@drawable/hex_green_border"
android:layout_column="1"
android:layout_marginLeft="@dimen/margin_cell_horizontal"
android:layout_marginRight="@dimen/margin_cell_horizontal"
/>
</TableRow>
<TableRow
android:layout_marginTop="@dimen/margin_cell_vertical"
android:layout_marginBottom="0dp"
>
<ImageView android:src="@drawable/hex_grey"
android:layout_column="0"
android:layout_marginLeft="0dp"
android:layout_marginRight="@dimen/margin_cell_horizontal"
/>
<ImageView android:src="@drawable/hex_red_border"
android:layout_column="2"
android:layout_marginLeft="@dimen/margin_cell_horizontal"
android:layout_marginRight="0dp"
/>
</TableRow>
</TableLayout>
(margin_cell_horizontal
和margin_cell_vertical
都是负常数,用于指定网格的精确外观。另请注意顶部和底部行以及最左侧的0dp
边距和正确的细胞。)
这导致了
当我没有在边缘处将边距设置为0dp
时,边缘处的六边形的外观将不可见。
在实践中,网格将是15个单元格,总共包含120个单元格,但将来可能会有所不同。
这里TableLayout
是否正确,是否合理(重新创建和)根据每次更新时的游戏状态动态重绘整个表?我尝试使用GridView
进行此操作,其中onClickListeners
易于处理且使用adapter
进行更新很容易,但我没有成功创建了网格布局。
另一个小问题(我还没有真正想过如何做到这一点):当为单元格实现onclicklistener时,每个单元格都需要自己的id和listener吗?对我来说这感觉太过分了,但也许这是必要的。
答案 0 :(得分:2)
最好的方法可能是既不使用可用的布局,而是创建自己的布局......一个HexLayout ......你所要做的只是继承ViewGroup并覆盖onLayout()方法。这篇文章可能很有意思...... http://arpitonline.com/blog/2012/07/01/creating-custom-layouts-for-android/ 从文章......
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int itemWidth = (r-l)/getChildCount();
for(int i=0; i< this.getChildCount(); i++){
View v = getChildAt(i);
v.layout(itemWidth*i, t, (i+1)*itemWidth, b);
}
}
因此,在onLayout()中,您将遍历子项并相应地放置它们。