【问题标题】:Compatibility with different resolutions/inches兼容不同分辨率/英寸
【发布时间】:2020-07-24 22:24:17
【问题描述】:

我正在开发一个应用,但我的约束布局与任何屏幕尺寸都不兼容。

我有一个宽度和高度如下的按钮:

android:layout_width="283dp"
android:layout_height="57dp"

Here's 使用 Google Pixel 的外观。 还有here's 使用 Nexus S 的样子

我还将 apk 发送给了一个拥有 Galaxy J7 (1280x720, 5.5') 的人,但我的按钮、文本视图和图像视图不能很好地适应屏幕,就像 Nexus S (800x480, 4') .

在阅读了文档和其他资源之后,我了解到我可以为不同的屏幕创建不同的布局(例如,hdpi,Nexus S 就是这种情况)。

但看起来问题更多与显示英寸有关,而不是与设备 dpi 相关。 因为 Nexus S 具有 800x480、hdpi 和 4' 屏幕。但是当我换成 800x480、mdpi 和 5.1 英寸的屏幕(多 1.1 英寸)时,它looks 比在 Nexus S 中要好得多,即使 dpi (mdpi) 较低。即使屏幕尺寸(5.1' x 5.5')和分辨率(800x480 vs 1280x720)更小,它看起来也比 Galaxy J7 真机更好。

那么,它怎么能很好地适应 800x480 5.1' mdpi 屏幕,但不能适应 1280x720 5.5' Galaxy J7 和 800x480 4.0' hdpi 屏幕 (Nexus S)?

另外,如果我创建一个与 Galaxy J7 真实设备(1280x720 和 5.5')具有相同屏幕规格的虚拟设备,它非常适合,不像真实手机。

【问题讨论】:

  • 如果您不想自己制作多个dimens.xml,则应使用github.com/intuit/ssp 和github.com/intuit/sdp。它不会使您的应用在所有设备上显示完全相同,但在您的情况下它看起来比使用纯 dp 更好。
  • @ThuanTang 我看过这些库,但我有点害怕使用它,因为它不是官方库。我使用android:autoSizeTextType、layout_constraintWidth_percent 和layout_constraintHeight_percent 解决了我的问题。
  • 那些库只包含很多dimens.xml文件,你可以去查看它们的源代码。 layout_constraintWidth_percent 和 layout_constraintHeight_percent 在你的情况下肯定不错,但与 dimens.xml 相比,它会花费很多性能

标签: android android-layout android-constraintlayout android-screen-support


【解决方案1】:

我建议你使用 Adob​​e XD 并用它来确定大小

android:layout_width="283dp"
android:layout_height="57dp"

然后提取所有尺寸的图片 然后使宽高 wrap_content 在 XML 文件中

【讨论】:

  • 我的设计不是很好,而且我从未使用过 Adob​​e XD。但是我会看看它,它会很有用。谢谢!
【解决方案2】:

您可以将固定大小(您当前赋予视图的大小)替换为更具响应性的内容。

如果这是您的无响应按钮:

<Button
android:layout_width="200dp"
android:layout_height="400dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

只需将其替换为:

<Button
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintWidth_percent="0.3"
    app:layout_constraintHeight_percent="0.5"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

对于每部手机,无论大小,此按钮都会根据屏幕大小进行调整,并将占用屏幕宽度的30% 和屏幕宽度的50%。 这就是您可以使一个屏幕响应所有屏幕尺寸而不为不同屏幕创建大量布局的方法。

【讨论】:

  • 谢谢!这比在dp 中使用预定义的大小要好得多。虽然它解决了按钮的问题,但它不适用于TextViews,但我发现了如何使用android:autoSizeTextType 自动调整TextViews,这对我也有很大帮助。
  • 您也可以使用ssp library 来发短信
  • 是的,我发现了这个库,但我有点害怕使用它,因为它不是官方库。不过我也会试试的。
  • 好吧,你总是可以找到一些新的库并尝试一下,也许你会发现它很实用。
【解决方案3】:

这些图片没问题,本身不是问题。当您手动设置宽度和高度时,通常会发生这种情况。

您可以做的最好的事情是设置正确的约束,然后将宽度和/或高度设置为 0dp。这将使您的视图在不破坏任何约束的情况下尽可能地扩展。这样你仍然会得到不同的宽度和高度,但希望不那么明显。

请注意,如果您将顶部和底部约束设置为父级,并且将高度设置为 0dp,它将扩展以填充其约束,它将填充您的整个父级。

如果需要,您可以使用指南来定位。每部手机的屏幕中间都会显示 50% 的水平线。所以你也可以限制视图。

【讨论】:

  • 我将右边距/左边距定义为 64dp,上/下边距定义为 40dp,在 Nexus S 中看起来不错,但如果我改用 Google Pixel,它看起来比我想要的要大到。我认为最好的办法是为不同的屏幕创建一个新布局。但是我不太了解这应该基于屏幕的哪个方面。因为,正如我所说,布局很适合 mdpi 屏幕,但不适用于英寸较少的 hdpi 屏幕,因为新布局应该基于 dpi,而不是英寸,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
相关资源
最近更新 更多