如何为多个Android屏幕大小制作布局?

28

我已经研究了一些关于构建适用于多个屏幕尺寸的布局的内容,现在需要进一步澄清。

是普遍做法为每个屏幕尺寸(小、中、大)制作一个单独的布局文件,还是有更简便的方法可以实现?

我一直在大屏设备上测试我的项目,即使我使用DIP(密度无关像素)设置填充、边距等,但在较小的屏幕上查看时仍会出现压缩。我应该为中等尺寸屏幕设计我的项目,然后让Android自动按比例缩放吗?

我不确定这是否是一个好问题,但我正在寻找设计多个屏幕尺寸的通用做法。你们都是怎么做的呢?

编辑:此外,例如,假设我有一个距离屏幕底部40dip的按钮,我应该写40dip,还是应该使用某种像素计算,如40 * screenWidth / blahblah之类的代码,以便根据用户的屏幕尺寸进行缩放?我对UI有限的经验...


是的,您可以以相当简单的方式完成此操作,请查看我的答案 https://dev59.com/clrUa4cB1Zd3GeqPkoji#16518557 - Muhammad Babar
3个回答

14

涉及屏幕尺寸时,有两个方面需要考虑:物理尺寸和密度。通过以dips为单位提供测量和适当缩放的资源来处理密度问题。但是密度并不总是等于尺寸或反之亦然。请参阅http://developer.android.com/guide/practices/screens_support.html了解相关机制。

通常情况下,不建议根据支持的每个屏幕分辨率使用不同的布局,但是设计不同的布局以适应不同的大小类别(小,中,大)完全合理。不同大小的屏幕可能受益于添加、删除或重新定位某些导航元素,具体取决于应用程序。

在特定的大小类别内,您应确保您的布局能够容忍精确的屏幕分辨率变化。如Falmarri所建议的那样,使用相对布局、权重和其他可用工具让您的布局能够优雅地伸展。


好的,这就是我感到困惑的地方。我注意到在正常大小的模拟器实例上查看我的应用程序时,我失去了内容的底部一英寸。所有东西都在正确缩放和定位。那么,我应该为不同的屏幕尺寸而不是密度使用单独的布局,对吗? - joepetrakovich
这是一种方法。但是,如果您的布局内容失去了底部一英寸,我猜测一切并没有正确缩放和定位。 ;)有许多不同的设备具有不同的分辨率和密度,所有这些设备都将报告屏幕大小为“正常”。单个布局应该能够处理这个问题。 - adamp
我应该将我的应用程序设计为基本大小为正常,然后让它缩放到大尺寸吗?因为我一直在做相反的事情。 - joepetrakovich
这可能是一个更容易入门的方式。不要害怕在设计中使用一些空白空间。 - adamp
我为每个布局设置了不同的格式,但还是无法工作。http://stackoverflow.com/questions/34378238/landscape-mode-for-app - Ruchir Baronia

3
一般规则是在布局xml中使用密度无关像素(dips)进行大小定义 - 我看到您已经这样做了。这样做,我只需要一个布局适用于所有设备范围。需要拆分的是图形。为此,我使用3个不同的可绘制目录 -“drawable-ldpi”,“drawable-mdpi”和“drawable-hdpi”。这样做是为了使图像在各种屏幕密度上具有相同的尺寸(比如,以毫米为单位),假设屏幕尺寸相同(例如,Normal),它们应按以下比例缩放:
  • drawable-hdpi:150%
  • drawable-mdpi:100%
  • drawable-ldpi:75%
也许这是一个不好的建议。但是,如果您查看Google屏幕尺寸和密度图表,您可以决定不投入额外的努力进行大屏幕的彻底测试,因为市场上几乎没有这样的设备。

我也支持Falmarri - 使用相对布局。视图应该只填充父级或包裹内容。可能仅使用常量来设置文本大小和填充/边距。 - Vit Khudenko
当你说“scaled”时,你是指像这样的东西吗:打开Photoshop,加载图像,然后转到文件>缩放图像(或类似的选项),并将其缩小一定百分比? - joepetrakovich
@PetrakovichJ:是的,我的意思是在将图像放入这些目录之前,应该在某个图像编辑器中对它们进行缩放。 - Vit Khudenko
好的,还有一件事,我是在缩放图像大小还是图像分辨率?我是让Android自己缩放它们的大小吗? - joepetrakovich
1
@PetrakovichJ:好的 :) 假设您有一个按钮的主/母图像,其尺寸为1000x1000像素。为了在每个屏幕密度下以相同的物理大小(例如以毫米为单位),并且假设mdpi上的100x100像素对于您的应用程序是可以接受的,您应该在图像编辑器中缩小(或调整其大小)主图像到:mdpi的100x100像素,hdpi的150x150像素,ldpi的75x75像素。我希望这个使用案例能够帮助您理解这个概念。 - Vit Khudenko
我对每个布局都进行了不同设置,但仍然无法正常工作。http://stackoverflow.com/questions/34378238/landscape-mode-for-app - Ruchir Baronia

1

不制作单独的布局并不是常见做法。只有当您有无法拉伸的图像时,这才是推荐的方式。

在较小/较大的屏幕设备上查看时,东西总是会看起来有点拉伸/压缩。这就是不同尺寸屏幕的定义。您应该使用相对布局,让Android控制具体的像素数。


我为每个布局设置了不同的样式,但仍然无法正常工作。http://stackoverflow.com/questions/34378238/landscape-mode-for-app - Ruchir Baronia
这个问题已经有5年了,请提出一个新的问题。 - Falmarri
为什么?只需提出新问题。你为什么认为五年前回答过类似问题的人会关心你的新问题呢? - Falmarri
你不理解我在说什么。我已经发了一个新的问题。我还向你简单地提供了链接。我期望在这个领域有足够知识回答这个问题的人也能够回答我的问题。我想我错了。 - Ruchir Baronia

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