Android TableLayout hexgrid最佳方法

时间:2014-03-15 21:28:33

标签: android android-tablelayout

我制作的游戏中用户需要能够看到多种颜色的六边形网格(它们只是不同的图像),并且需要能够点击其中的一些(灰色的)。我现在使用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_horizontalmargin_cell_vertical都是负常数,用于指定网格的精确外观。另请注意顶部和底部行以及最左侧的0dp边距和正确的细胞。)
这导致了 hexgrid
当我没有在边缘处将边距设置为0dp时,边缘处的六边形的外观将不可见。

在实践中,网格将是15个单元格,总共包含120个单元格,但将来可能会有所不同。

这里TableLayout是否正确,是否合理(重新创建和)根据每次更新时的游戏状态动态重绘整个表?我尝试使用GridView进行此操作,其中onClickListeners易于处理且使用adapter进行更新很容易,但我没有成功创建了网格布局。

另一个小问题(我还没有真正想过如何做到这一点):当为单元格实现onclicklistener时,每个单元格都需要自己的id和listener吗?对我来说这感觉太过分了,但也许这是必要的。

1 个答案:

答案 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()中,您将遍历子项并相应地放置它们。