Android Studio - 图像展开按钮(并打破权重规则?)

Android Studio - Images Expand Buttons (and break weight rules?)

我一直在解决一个问题太久了。每当我将图像放入 ImageButton 时,按钮都会扩展到非常大。为了尝试解决这个问题,我创建了一个带有 TableRows 的 TableLayout,其中 TableLayout 有一个 weightSum,每行都有自己的 layout_weight。但是,无论我为一行分配多少权重,图像都会膨胀并压缩我所有其他行。换句话说,TableRows 不遵守分配给它们的 layout_weight。

下面,我有四行,权重分别为 4、5、3、1。 ImageButton 在第 3 行 layout_weight="3"。但是,如您所见,该行会扩展以适合按钮图像。

无论如何,当我在屏幕上有多个按钮时,这是一个主要问题。我已经创建了许多相同尺寸的按钮,我认为我会把它们变大,这样它们就可以在更大的设备上很好地缩放。再一次,问题是它们不会缩小以适合按钮内部,而是会展开按钮,从而破坏该过程中的所有 layout_weight。

<?xml version="1.0" encoding="utf-8"?>
    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:weightSum="13"
        android:background="@drawable/edit_users_view">

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="4"/>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="5">
            <ScrollView>
                <!-- Figure out button first -->
            </ScrollView>
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="3">
            <ImageButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/selector_cancel_button"/>

        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1">
        </TableRow>
</TableLayout>

此外 - 这个问题可能部分与我存储图像的方式有关。我已将所有内容保存到我的可绘制文件夹中,但我的 mipmap 文件夹中没有任何内容。虽然,我确实尝试将此取消按钮保存到 mipmap-mdpi 文件夹中并将其加载到 ImageButton 中,但效果完全相同。 Mipmap 文件夹可能只是设置分辨率,而不是大小?我没有展开我的 drawable 文件夹,因为里面可能有 50 images/selectors。

<ImageButton
android:layout_width="XXdp"
android:layout_height="XXdp"
android:background="@drawable/selector_cancel_button"/>

为您的 ImageButton 设置一个特定的密度像素,它将限制它的扩展。

这个答案更像是一个 HACK。正确的做法是为所有屏幕尺寸设置不同的图像。

ldpi、mdpi、hdpi、xhpdi、xxhdpi、xxxhdpi。关于如何实现这一点,Stack 上有多个开放线程。希望有所帮助。

我能推荐给您的最好方法是让您的图像以您的目标最高分辨率切片,假设您的目标更高分辨率是 1080x1920。让你的屏幕设计成这个分辨率,并从这个屏幕设计中获得实际尺寸的图像。将这些图像放在相应的 "drawable" 而不是 "mipmap" 中,例如 1080x1920,相应的文件夹是 "drawable-xxhdpi"。通过可绘制文件夹访问您的图像,然后您甚至不需要使用权重甚至固定大小。它会像一个魅力。

问题是我使用单一布局大小和单一可绘制大小的按钮。事实上,有不同的屏幕密度,每个屏幕都应该有不同的图像。对于 android 编程新手,您可以看到我的项目文件夹从一开始就变成了 "should have been" 的样子。往下看。

简短说明 - 例如,androd:layout_weight="1" 表示该布局对整个布局的重要性。 layout_weights 较低的小部件或布局比 layout_weights 较高的小部件或布局具有更高的优先级。据我所知,weightSum 和 layout_weight 没有关系,就像我认为它们在我的 XML 示例中一样。

_

我创建了不同大小的图像并将它们放在各自的文件夹中,其中第一个可绘制文件夹仅用于 "selectors"。每个文件夹都有相同的图像,只比上一个文件夹小 80%。 Android 自动为您拍摄正确的图像并将其添加到您正在使用的布局预览中。获得每个文件夹大小的所有图像后,我压缩文件,然后将它们添加到 android studio。我的程序在任何 phone 上都不再有任何问题 运行。更不用说使用我的按钮更容易了,因为它们对于小型 phones 来说并不是很大,对于 XLarge 设备来说是正常尺寸。

如果内存不足错误仍然存​​在,可以增加 manifest.xml 中的堆大小,但这似乎没有必要,除非您正在制作游戏。我尝试在我的超级小程序中增加堆,我可以看到某些设备上的速度差异 - 这里的教训是避免 largeHeap="true" 除非你真的需要它

底线是,如果您想要一个好的程序,没有捷径可走。学习像毕加索这样的图书馆也需要时间。选择你的毒药。

最后一点,您可以看到现在有 4 个布局文件夹。它们每个都包含 XML 个独立编程的文件,因此对于每个屏幕密度,一切看起来都一样。如果我们在这里说实话,这主要是复制和粘贴,对每个 XML 进行少量修改。在每个文件夹中制作 XML 文件时,将它们命名为相同的名称。因此 activityMain.xml 将在所有 4 个文件夹中创建,并且设备 运行 应用程序将从设备认为适合其屏幕密度的文件夹中选择正确的 XML 布局。其实很神奇。