相同的DPI但不同的英寸尺寸

4
我知道网络上有很多关于DPI、px、英寸等的问题,但是经过几个小时的谷歌搜索,似乎没有人遇到和我一样的情况!
我有两个使用Android Studio自定义构建的设备,它们都是mdpi。但是,一个设备是3.65英寸,另一个设备是10.1英寸。
我创建了一个文件夹,其中包含两个分辨率为250x125,dpi设置为160 dpi的图像。
如果通常我会在我的XML中使用dp单位而不是像素来声明我的两个图像...我会想,在两个屏幕上的结果应该是相同的,对吧?
嗯,似乎这些图像保持相同的大小,而不考虑设备的英寸数。
因此,为了澄清事情: 我需要更改我的资源或代码以使我的布局在不同英寸大小的情况下缩放成相同的比例?
这是我针对我的mdpi 10.1平板电脑的好布局: enter image description here 这是我针对我的mdpi 3.65设备的糟糕布局 enter image description here 我该如何使即使在3.65英寸的屏幕上,按钮也能按照与10.1相同的比例缩放?不是英寸...不是像素...而是比例...
这是我的XML文件。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    android:gravity="center">

    <Button
        android:id="@+id/buttonEnglish"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/english"
        android:layout_marginBottom="5sp"
        android:layout_marginLeft="5sp"
        android:layout_marginRight="2sp"
        android:layout_marginTop="0sp" />
    <Button
        android:id="@+id/buttonNederlands"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/nederlands"
        android:layout_marginBottom="5sp"
        android:layout_marginLeft="20sp"
        android:layout_marginRight="5sp"
        android:layout_marginTop="0sp"
        />
</LinearLayout>

我感到绝望... 提前致谢


仔细观察你的按钮大小。它们保持相同的尺寸。但由于不同的屏幕尺寸,小按钮看起来占据了大部分屏幕空间。实际上,你需要设计两个XML布局,一个用于平板电脑,一个用于手机。 - Amir
那么针对市场上每种可能的手机或平板尺寸我都需要创建不同的XML文件吗?这太疯狂了! - Fosa
你对Android中UI布局的理解是错误的 - 按钮或其他UI组件与屏幕尺寸线性缩放毫无意义。请参考http://developer.android.com/guide/practices/screens_support.html和众多教程网站以了解更多信息。 - Kai
3个回答

3

不需要设计两个xml布局。

您可以根据设备使用尺寸来设置边距和填充。

您正在为边距提供静态值。

在每个设备的value文件夹中使用dimen.xml。

以下代码在您的layout.xml中将起作用。

android:layout_marginLeft="@dimen/margin_button"

dimen.xml中的值文件夹名称:

values-mdpi
values-hdpi
values-xhdpi
values-xxhdpi
values-sw600dp

在每个值文件夹中创建dimen.xml。

在dimen.xml中,您需要为所有值文件夹定义边距值,但该属性的值根据设备大小而异,如下所示:

values-mdpi

<dimen name="margin_button">20dp</dimen>

值-hdpi

<dimen name="margin_button">23dp</dimen>

在所有值文件夹中也是如此。

我不理解这怎么可能是一个解决方案?你能更具体地说明一下吗? - Fosa

3
这可能有助于解释您正在面临的问题...
您有一个尺寸为250x125的图像-宽度为250像素,高度为125像素。
您已经指定了160 dpi-这意味着1英寸=160像素。
因此,两个屏幕都在按您要求的方式显示250个像素跨越1.5625英寸。在大屏幕上,它看起来"比例"正确。在3.65英寸的屏幕上,按钮占据超过了一半的屏幕-就像您要求的那样。
如果您希望较小的屏幕看起来像较大的屏幕,则有三个选项:
  1. 调整图像的大小并提供2个图像资产(或更多以适应更广泛的屏幕)。这就是为什么可以有mdpi、hdpi、xhdpi等资源文件夹的原因。您调整图像中的像素以适应屏幕大小。
  2. 使用"加权"LinearLayout根据可用屏幕空间调整提供的空间大小。对于这种类型的布局,您不必担心性能。
  3. 根据屏幕大小进行运行时缩放图像-使用DisplayMetrics获取屏幕的大小和密度,并相应地调整图像以适合屏幕。
在许多方面,最后一个选项是最灵活的,因为如果您最终拥有非常大或非常小的屏幕,则可以进行调整以执行诸如将按钮或文本移动到屏幕上的其他位置(在其他内容上方或下方)之类的操作。但对于您的具体问题,任何一个选项都足够。

0

感谢大家的答复,由于@Iacs的答案,我发现我需要对文件夹结构进行更改。

我完全忽视了/res文件夹中可以存在比标准“layout”文件夹更多的目录。你可以创建其他具有以下名称的目录:layout-large、layout-xlarge、layout-small等等...... 在这些文件夹中,你可以粘贴你的layout.xml和调整值......

这就是我的Android Studio现在看起来的样子。 请注意layout文件夹的结构: enter image description here

现在,我的两个设备虽然DPI相同但屏幕大小不同,但显示我的按钮的方式是我想要的!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接