1

我是 Android 开发的新手,所以我一直在开发一个国际象棋应用程序来自学。但是,我现在卡住了。本质上,我需要一个好方法来绘制一个 8x8 的 ImageButtons 网格,这样:

  1. 按钮填满整个网格
  2. 网格空间在按钮之间均匀分布
  3. 按钮之间没有间隙(澄清#2)
  4. 网格是方形的,它的大小可以控制(我希望能够根据屏幕大小自动调整大小)。

或者,简单地说,它应该看起来像一个标准的棋盘:)

我尝试了几种布局都没有成功。目前,这是我能做到的最好的:

我在 PlayGameActivity 中以下列方式使用 GridLayout (应该在哪里绘制棋盘):

public void onStart(){
    super.onStart();

    board = (GridLayout)findViewById(R.id.chessboard);
    board.setColumnCount(8);
    board.setRowCount(8);

    for(int i = 0; i < 8; i++){
        for(int j = 0; j < 8; j++){
            ImageButton square = squares[i][j] = new ImageButton(this);
            GridLayout.LayoutParams params = new GridLayout.LayoutParams();
            params.rightMargin = 0;
            params.topMargin = 0;
            params.height = params.WRAP_CONTENT;
            params.width = params.WRAP_CONTENT;
            params.setGravity(Gravity.FILL);
            params.rowSpec = GridLayout.spec(i);
            params.columnSpec = GridLayout.spec(j);

            board.addView(square, params);

            //board.addView(square);
        }
    }}

棋盘是通过 XML 定义的,如下所示:

<GridLayout
    android:id="@+id/chessboard"
    android:layout_width="353dp"
    android:layout_height="353dp"
    android:layout_marginBottom="104dp"
    android:layout_marginEnd="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="104dp"
    android:background="#000000"
    android:gravity="center_horizontal"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    tools:layout_constraintBottom_creator="1"
    tools:layout_constraintLeft_creator="1"
    tools:layout_constraintRight_creator="1"
    tools:layout_constraintTop_creator="1">
</GridLayout>

我为此类问题找到的所有解决方案都采用 Android XML 的形式。也许我对这种方法的担忧是基于无知,但我的理解是我必须将 64 个正方形复制并粘贴到 GridLayout 或其他东西中。另外,我不确定如何使用这种方法根据屏幕尺寸调整大小。理想情况下,我正在寻找一个严格的程序化解决方案(无论如何这是我首选的 UI 设计方法)。

4

1 回答 1

0

我的建议是通过使用include链接)使用 xml 进行模块化:

<include layout="@layout/titlebar"/>

Usinginclude允许您在自己的文件中编写一段 XML 代码,然后多次使用它。我还建议在大多数情况下不要使用 GridLayout,因为它们只是没有像其他一些布局类型那样为您提供尽可能多的控制。如果这是我的代码,我会这样做:

  1. 在自己的ImageButtonXML 文件中使用android:layout_weight="1".
  2. 使用、和在其自己的 XML 文件中创建一个LinearLayout“行” ,然后使用 复制并粘贴 8秒。android:orientation="horizontal"android:layout_weight="1"android:weightSum="8"includelayout="@layout/[your_image_button]"
  3. LinearLayout在您当前拥有GridLayout. 这个会有android:orientation="vertical"android:weightSum="8"。然后复制并粘贴 8includelayout="@layout/[your_linear_layout_row]"

有很多方法可以做到这一点,但这种方式可以让您对所有内容的空间布局方式进行大量控制,并且它的逻辑与您当前用于动态布局所有内容的“数组数组”方法非常相似出去。如果您想走动态 java 路线,我的建议是在 java 中执行这种基于 LinearLayout 的网格方法(您甚至可以在 XML 中创建 ImageButton 并使用 aLayoutInflater来扩展 ImageButton 的副本)。在外层for循环中,可以新建一个LinearLayout,添加到外层LinearLayout中;然后在内部for循环中,创建 ImageButton 并将其添加到内部 LinearLayout。

编辑:关于行不同的好点!这使得纯 XML 解决方案不太干净。如果您使用纯 XML,我将只执行上述步骤 2 两次:一次是白色,然后是黑色;另一次是黑色然后是白色。对于黑色瓷砖,这可能看起来像:

<include layout="@layout/your_imagebutton"
  android:backgroundColor="#000"
/>

如果这种方法对您来说太麻烦,您可以通过循环遍历 LinearLayout 行和 ImageButton 块来设置背景颜色来动态设置颜色。我认为您会发现它比使用 GridLayout 方法更容易。

于 2017-08-12T00:07:25.587 回答