Android:根据屏幕分辨率调整视图大小

Android: Resizing Views Based On Screen Resolution

我正在开发一款西洋跳棋游戏。棋盘被定义为具有 8 列和 8 行的 GridView。每个红色方块都是一个 ImageButton,每个黑色方块都是一个 ImageView(因为红色方块可以播放而黑色方块则不能)。 ImageButtons 和 ImageViews 每个都有一个 drawable,它可以是红色格子、黑色格子或没有格子。每个可绘制对象为 50dpx50dp。

我正在尝试让电路板自行调整大小,以便它始终填充大约 80% 的可用屏幕。我尝试的第一件事是创建可绘制对象的“小”、“大”和“超大”变体,这让我非常接近,但“小”屏幕和“大”屏幕之间的区别非常大,这会导致介于“小”和“大”之间的设备上出现大量屏幕空间浪费。

我想根据涉及当前屏幕分辨率的计算以编程方式调整可绘制对象的大小。我很高兴实现屏幕分辨率侦听器,但我不确定如何将侦听器连接到可绘制图像,或者是否有更好的方法来执行此操作。

我在谷歌上搜索了一下,看看能找到什么,我遇到的大部分内容都谈到使用不同的像素密度,但这并不是我真正遇到的问题。我还发现了一堆关于使用相对布局等的东西,但这对棋盘不起作用。

对于如何完成此任务的任何建议,我将不胜感激。谢谢!

编辑添加

根据@ben-p 的评论,我修改了我的代码,而且我越来越接近了。在我的布局文件中,我现在有:

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp">

        <fragment
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintDimensionRatio="1:1"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

在片段布局文件中,我有:

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:columnCount="8"
    android:rowCount="8">

    <ImageButton
        android:id="@+id/Tile00"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#cc0000"
        android:contentDescription="@string/game_checkers_red_tile"
        android:padding="0dp"
        android:src="@drawable/game_checkers_player_none" />

    <ImageView
        android:background="#000000"
        android:contentDescription="@string/game_checkers_black_tile"
        android:padding="0dp"
        android:src="@drawable/game_checkers_player_none" />

    <!-- repeated for a total of 64 tiles -->

</GridLayout>

这会将棋盘限制为屏幕上具有 1:1 纵横比的正方形,但不会缩放棋盘以显示所有 8x8 方块。在下面的示例中,您可以看到板被裁剪了:

让 ConstraintLayout 缩放 up/down 片段的内容以使其始终完全适合所提供的 space 的魔法咒语是什么?

我不得不稍微更改一下主视图代码:

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp">

        <fragment
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_constrainedHeight="true"
            app:layout_constrainedWidth="true"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintDimensionRatio="1:1"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

然后我不得不更改片段布局代码如下:

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:columnCount="8"
    android:rowCount="8">
    
    <ImageButton
        android:id="@+id/Tile00"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_rowWeight="1"
        android:layout_columnWeight="1"
        android:background="#cc0000"
        android:contentDescription="@string/game_checkers_red_tile"
        android:padding="0dp"
        android:src="@drawable/game_checkers_player_none" />
    
    <ImageView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_rowWeight="1"
        android:layout_columnWeight="1"
        android:background="#000000"
        android:contentDescription="@string/game_checkers_black_tile"
        android:padding="0dp"
        android:src="@drawable/game_checkers_player_none" />

    <!-- repeated for a total of 64 tiles -->

</GridLayout>

我这样做后,棋盘现在会按比例放大以填充可用的 space。