2024年Android最全【eoe教程】创建支持多种屏幕尺寸的Android应用(1),安卓开发自学书籍推荐

最后

在此为大家准备了四节优质的Android高级进阶视频:

架构师项目实战——全球首批Android开发者对Android架构的见解

附相关架构及资料

image.png

往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

密度无关性


当应用程序保留了用户界面元素的物理尺寸以不同的密度显示在屏幕上(从用户的角度来看)时,它实现了“密度无关性”。

维护密度无关系性很重要,因为,如果没有它,一个UI元素(如按钮)在一个低密度屏幕上看起来较大而在一个高密度屏幕上看起来很小。这样的密度相关的尺寸的改变影响应用程序的布局和使用。图2和图3 分别展示了当它不提供密度无关性和提供了密度无关性时,应用程序之间的差异。

http://developer.android.com/images/screens_support/density-test-bad.png

图2 当不提供密度无关性,应用程序在低、中等、高密度屏幕上显示实例

http://developer.android.com/images/screens_support/density-test-good.png

图3 当提供密度无关性,应用程序在低、中等、高密度屏幕上显示实例

Android系统通过以下两种方式帮助应用程序实现密度无关性:

* 系统为当前屏幕密度调整dp单位到适当的值

* 如有必要,系统会根据当前屏幕密度调整绘图资源到适当的尺寸

在图2中,文本视图和位图绘图有规定的尺寸的像素(像素单位),因此这些视图在低密度屏幕上看起来较大,在高密度屏幕上看起来较小。这是因为尽管实际的屏幕尺寸是一样的,但是高密度屏每英尺有较多的像素(相同数量的像素适合于较小区域)。在图3中,布局的尺寸被指定为密度无关性像素(dp 单位)。因为密度无关性像素的基线是中等密度的屏幕,一个有中等密度屏幕的设备看上去与图2中的一样。对于低密度和高密度屏幕而言,不管怎样,系统能分别降低、调高密度无关性像素的值去恰当地适应屏幕。

在大多数情况下,你可以简单地在密度无关性像素里(dp 单位)指定所有的布局尺寸或者恰当地“包装内容”来确保应用程序的密度无关性。然后系统会根据恰当的缩放因子为当前屏幕密度调整位图视图以适当的尺寸显示出来。

但是,位图缩放会导致图片模糊,如上面的截图。为了避免这些问题,应该为不同的密度提供替代位图资源。例如,应该给高密度屏幕提供更高分辨率的位图,系统会使用它们,而不是使用为中等密度屏幕设计的缩放位图。以下段落将介绍更多关于如何提供不同替代资源给不同的屏幕配置。

如何支持多屏

======

Android支持多屏的基础是它能够以适当的方式为当前屏幕设置管理应用程序的布局和位图绘图的渲染。根据实际情况,系统通过缩放布局去适应屏幕的尺寸/密度和为屏幕密度缩放位图绘图,处理大部分工作去适当地渲染应用程序到每一个屏幕配置。然而,为了更好地处理不同屏幕配置,应该:

* * 在清单文件中明确申明应用程序支持哪种屏幕大小*

通过申明应用程序支持哪种屏幕尺寸,可以确保只有支持的屏幕尺寸的设备才能下载应用程序。声明支持不同屏幕尺寸也会影响系统如何在较大屏幕上运行应用程序,尤其是,不论应用程序是否运行在屏幕兼容模式。

为了申明应用程序支持的屏幕大小,应该在manifest文件中包含的元素。

  • * 为不同的屏幕尺寸提供不同的布局*

默认情况下,Android会重新调整应用布局去适合当前设备屏幕。在大多数情况下,这样做很好。在其它情况下,UI可能看上去不太好且可能不同屏幕尺寸需要调整。例如,在较大屏幕上,可能会调整某些元素的位置和尺寸去充分利用额外的屏幕空间,或者在一个较小屏幕上,会调整尺寸使得一切都可以在屏幕上显示。

可以提供指定大小资源的配置限定符,有小、标准、大、超大。例如,一个超大屏幕的布局应该选Xlarge。

从Android3.2(API等级为13)起,上面的尺寸分组已被弃用,你应该使用swdp配置限定符去定义布局资源需要的最小的可用的宽度。例如,如果多窗格平板布局需要至少600dp的屏幕宽度,应该选sw600dp。使用新技术申明布局资源将会在Declaring Tablet Layouts for Android 3.2章节讨论。

  • * 为不同的屏幕密度提供不同的位图绘图*

默认情况下,Android调整你的位图绘图(.png, .jpg, and .gif 文件)和9补丁绘图(.9.png 文件),让他们在每个设备上以适当的物理尺寸呈现。例如,你用程序只为基线、中等屏幕密度(mdpi)提供了位图绘图,系统会调高高密度屏幕,降低低密度屏幕。这些调整会导致图片不真实。为了确保图片看起来最好,应当在不同分辨率下包含替代版本去适应不同的屏幕密度。可以用来指定密度资源的配置限定符有ldpi(低)、mdpi (中等), hdpi (高), and xhdpi (超高)。例如,高密度屏幕的位图应该选hdpi。

尺寸和密度配置限定符与上面的支持的屏幕范围中描述的广义尺寸和密度一致。

注释:如果你不太熟悉配置限定符且不知道系统如何使用他们应用替代资源的话,请阅读Providing Alternative Resources章节获取更多信息。

在运行时,对于任何给定的资源,系统通过以下步骤实现在当前屏幕上获取最佳的显示:

1.系统使用适当的替代资源

基于当前屏幕的尺寸和密度,系统会使用应用程序里的任何指定尺寸和密度的资源。例如,如果设备有一个高密度屏幕且应用程序请求绘图资源时,,系统会在绘图资源目录寻找最匹配的设备配置。依赖于其他可用的替代资源,一个有hdpi限定符的资源目录(如 drawable-hdpi)可能是最匹配的,因此系统使用这个目录中的绘图资源。

2.如果没有匹配的资源可用,系统会使用默认资源且会调高或降低资源去匹配当前屏幕的尺寸和密度这些“默认”资源是指那些没有配置限定符标记的资源。例如在drawable/中的资源就是默认的绘图资源。系统假定默认资源是为基准屏幕尺寸和密度设计的,即标准屏幕尺寸和中等密度。例如,系统会恰当地为高密度屏幕调高默认密度资源,为低密度屏幕降低默认资源。

然而,当系统在寻找一个指定密度的资源且在指定密度目录没找到它时,它不会总是使用默认资源。为了获取更好的效果,系统会使用一个其他指定密度资源。例如,当系统在寻找一个低密度资源且这个资源是不可用时,系统更喜欢降低高密度版本的资源,因为系统可以简单地乘以0.5系数将高密度资源降低为低密度,与调整中等密度资源乘以0.75系数相比,这样用到很少的工件。

关于Android是如何通过匹配配置限定符到设备配置来选择替代资源的更多信息,请阅读How Android Finds the Best-matching Resource章节。

使用配置限定符


Android支持多种配置限定符,让你控制系统如何基于当前设备屏幕的特征选择替代资源。一个配置限定符是一个字符串,你可以把它附加到你的Android工程的资源目录中并指定里面的资源是为此配置设计的。

为了使用配置限定符:

1.在你的工程的res目录创建一个新目录,并使用格式命名:

:-

:是标准的资源名称(如drawable or layout)。

:是下面表1中的配置限定符,指定这些资源将要被用的屏幕配置(如hdpi or xlarge)。

2.保存这些适当的指定配置的资源到这个新目录。这些资源文件的命名必须严格与默认的资源文件名一样.

例如,xlarge是用于超大屏幕的配置限定符。当你添加这些字符串到一个资源目录名(如layout-xlarge)时,它告诉系统这些资源将被用到有超大屏幕的设备上。

表1 允许你提供指定资源给不同屏幕配置的配置限定符

{|style="border-spacing: 0px;margin: 4px 4px; width: 90%; border-left:1px solid #ccc;border-top:1px solid #ccc; "

|-style="background:#DEE8F1; "

! style=“border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px” | Screen characteristic

! style=“border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px” | Qualifier

! style=“border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px” | Description

|- style=" vertical-align:top;"

| style=" border-right:1px solid #ccc;border-bottom:0px solid #ccc; padding:5px 15px; " |

Size

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

small

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

Resources for small size screens

|- style=" vertical-align:top;"

| style=" border-right:1px solid #ccc;border-bottom:0px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

normal

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

Resources for normal size screens. (This is the baseline size.)

|- style=" vertical-align:top;"

| style=" border-right:1px solid #ccc;border-bottom:0px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

large

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

Resources for large size screens.

|- style=" vertical-align:top;"

| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

xlarge

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

Resources for extra large size screens

|- style=" vertical-align:top;"

| style=" border-right:1px solid #ccc;border-bottom:0px solid #ccc; padding:5px 15px; " |

Density

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

ldpi

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

Resources for low-density (ldpi) screens (~120dpi).

|- style=" vertical-align:top;"

| style=" border-right:1px solid #ccc;border-bottom:0px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

mdpi

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

Resources for medium-density (mdpi) screens (~160dpi). (This is the baseline density.)

|- style=" vertical-align:top;"

| style=" border-right:1px solid #ccc;border-bottom:0px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

hdpi

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

Resources for high-density (hdpi) screens (~240dpi).

|- style=" vertical-align:top;"

| style=" border-right:1px solid #ccc;border-bottom:0px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

xhdpi

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

Resources for extra high-density (xhdpi) screens (~320dpi).

|- style=" vertical-align:top;"

| style=" border-right:1px solid #ccc;border-bottom:0px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

nodpi

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

Resources for all densities. These are density-independent resources. The system does not scale resources tagged with this qualifier, regardless of the current screen’s density.

|- style=" vertical-align:top;"

| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

tvdpi

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

Resources for screens somewhere between mdpi and hdpi; approximately 213dpi. This is not considered a “primary” density group. It is mostly intended for televisions and most apps shouldn’t need it—providing mdpi and hdpi resources is sufficient for most apps and the system will scale them as appropriate. If you find it necessary to provide tvdpi resources, you should size them at a factor of 1.33* mdpi. For example, a 100px x 100px image for mdpi screens should be 133px x 133px for tvdpi.

|- style=" vertical-align:top;"

| style=" border-right:1px solid #ccc;border-bottom:0px solid #ccc; padding:5px 15px; " |

Orientation

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

land

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

Resources for screens in the landscape orientation (wide aspect ratio).

|- style=" vertical-align:top;"

| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

port

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

Resources for screens in the portrait orientation (tall aspect ratio).

|- style=" vertical-align:top;"

| style=" border-right:1px solid #ccc;border-bottom:0px solid #ccc; padding:5px 15px; " |

Aspect ratio

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

long

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

Resources for screens that have a significantly taller or wider aspect ratio (when in portrait or landscape orientation, respectively) than the baseline screen configuration.

|- style=" vertical-align:top;"

| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

notlong

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

Resources for use screens that have an aspect ratio that is similar to the baseline screen configuration.

|}

注:如果在Android3.2或者更高版本上开发应用程序,请参阅Declaring Tablet Layouts for Android 3.2章节获取关于新的配置限定符的信息,当申明了指定屏幕尺寸(而不是使用表1中的尺寸限定符的布局资源时,你应当使用这些限定符。

获取更多关于这些限定符如何大致对应于真实的屏幕尺寸和密度的信息,请参阅本文中前面提到的支持的屏幕范围章节。

例如,下面是应用程序中的资源目录列表,这个程序为中等、高及超高密度屏幕提供了不同的为不同屏幕尺寸和位图绘图设计的布局。

res/layout/my_layout.xml // 标准屏幕尺寸的布局(“默认”)

res/layout-small/my_layout.xml // 小屏幕尺寸的布局

res/layout-large/my_layout.xml // 大屏幕尺寸的布局

res/layout-xlarge/my_layout.xml //超大屏幕尺寸的布局

res/layout-xlarge-land/my_layout.xml // 横向超大的屏幕布局

res/drawable-mdpi/my_icon.png // 中等密度的位图

res/drawable-hdpi/my_icon.png //高密度的位图

res/drawable-xhdpi/my_icon.png // 超高密度的位图

如需要更多关于如何使用替代资源和完整的配置限定符列表(不仅仅是屏幕配置)的信息,请参阅Providing Alternative Resources。

请注意,当Android系统挑选资源时,它采用一定的逻辑来判定“最匹配”资源。也就是说,使用的限定符没必要在所有情况下,为了系统能用到它而严格匹配当前屏幕配置。具体来说,当基于尺寸的限定符选择资源时,如果没有更匹配的资源,系统会使用比当前屏幕更小的屏幕资源(例如,必要时,大尺寸屏幕将会使用标准尺寸屏幕资源)。但是,如果唯一可用的屏幕资源比当前屏幕大,系统将不会使用它们,而且如果没有其他匹配设备的配置的话,应用程序将会崩溃(例如,如果所有布局资源都被标记为xlarger限定符,但是设备是一个标准尺寸的屏幕)。更多关于系统如何选择资源的信息,请阅读How Android Finds the Best-matching Resource章节。

小提示:如果你有一些系统从未调整过的绘图资源(或许因为在运行时对其进行了调整),应当把他们放置在nodpi配置个限定符的目录。有这些限定符的资源被认为是密度不可知的资源,系统将不会调整它们。

设计可替代的布局和绘图


应该创建的可替代资源的类型取决于应用程序的需要。通常,应该使用尺寸和方向限定符提供可替代的布局资源,使用密度限定符去提供替代的位图绘图资源。

下面的段落分别总结了应该如何使用尺寸和密度限定符来提供替代的布局和绘图。

可替代的布局

一般情况下,一旦在不同屏幕配置上测试应用程序,应该知道是否需要为不同屏幕尺寸创建可替代的布局。例如:

  • 当在小屏幕上测试时,可能会发现,布局不是很适合这个屏幕。例如,一排按钮可能不适合在小屏幕的设备的屏幕宽度内。这种情况下,应该为小屏幕提供一种可替代的布局,即通过调整这些按钮的大小或位置。

  • 当在超大屏幕上测试时,可能会意识到,布局并没有有效地利用大屏幕,而是通过拉伸来填充它。在这种情况下,应该为超大屏幕提供一种可替代的布局,即可通过提供一种重新设计的最合适于较大屏幕如平板的UI。

    虽然应用程序应当可以在没有可替代布局的大屏幕上工作正常,但是,对用户来说,程序看起来好像是专门为他们的设备设计的这一点非常重要。如果是很明显被拉伸的UI,用户对应用程序体验会更加不满意。

  • 而且,当在横向测试时可能会注意到,与纵向相比较,放置在纵向屏幕底部的UI元素应该是在横向屏幕的右侧。

简而言之,应该确保应用程序的布局:

* 适合在小屏幕上(这样用户真正使用应用程序)

* 优化大屏幕,充分利用额外的屏幕空间

* 优化横向和纵向两个方向

如果在系统调整了布局后,UI要使用合适大小的位图(如按钮的背景图片),应当使用九补丁的位图文件。九补丁文件基本是一个指定的可拉伸的二维PNG文件。当系统需要调整正在使用的位图的视图时,系统会拉伸九补丁位图,但仅延伸指定区域。同样地,没有必要提供不同的绘图给不同的屏幕尺寸,因为九补丁位图能调整任何大小。然而,应当提供可替代的九补丁文件的版本给不同屏幕密度。

可替代的绘图

几乎每个应用程序应该有对应于不同屏幕密度的可替代的绘图资源,因为几乎每个应用程序都有一个启动图标,而且图标应该在所有屏幕密度上看起来都很好。同样,如果在应用程序中包含了其他位图绘图(如菜单图标或应用程序的其他图像),应当提供可替代的版本或者每一个版本给不同的密度。

注:只需要给位图文件((.png, .jpg, or .gif)和九补丁文件(.9.png)提供指定密度的绘图。如果你使用XML去定义形状,颜色或者其他绘图资源,应该在默认的绘图目录(drawable/)做一个备份。

http://developer.android.com/images/screens_support/screens-densities.png

图4支持每个密度的位图绘图的相对尺寸

为了给不同密度创建可替代的位图绘图,应该遵循基于四种广义密度的3:4:6:8的缩放比例。例如,你有一个48x48像素的中等密度屏幕的位图绘图(一个启动图标的尺寸),所有不同的尺寸应该是:

  • 36x36适合于低密度

  • 48x48适合于中等密度

  • 72x72适合于高密度

  • 96x96适合于超高密度

获取更多关于设计图标的信息,请参阅the Icon Design Guidelines,文中包含了各种位图绘图的尺寸信息,如启动图标,菜单图标,状态栏图标,选项卡图标等等。

Android3.2平板布局的声明

=================

对于第一代运行在Android3.0上的平板,正确声明平板布局的方法是把他们放到一个有xlarge配置限定符的目录里(例如,res/layout-xlarge/)。为了适应其他类型的平板和屏幕尺寸-尤其是7寸平板-Android3.2为更多离散的屏幕尺寸引进了一种新的指定资源的方式。这项新技术是基于你的布局需要的空间(如600dp的宽度),而不是试图让你的布局去适合广义的尺寸组(如large or xlarge)。

设计7寸平板的原因是非常复杂的,当时使用广义的尺寸组是指一个7寸的平板在技术上与一个5寸的手机在同一个组(大组)。虽然这两个设备在尺寸上看上去很接近,但是应用程序的UI的空间是显著不同的,用户交互的风格也是如此。因此,一个7寸和5寸的屏不应该总是使用同一个布局。为了把提供两种不同屏的布局变成可能,Android现在允许你基于宽度与/或者高度指定布局资源,在dp单位中指定,这对于应用程序布局很有效。

例如,在已经设计好了要用于平板类型的设备的布局后,当屏幕少于600dp宽时,可能会决定让布局停止工作。这个阈值因此会成为平板布局需要的最小尺寸。照此,现在会指定这些布局资源应当能被使用,仅仅在应用程序的UI有至少600dp宽度可用时。

应该要么选择宽度,并把它设计为最小尺寸,要么测试布局一旦完成时,它支持的最小宽度是多少。

注:请记住,所有的这些新尺寸的APPs使用的数字都是密度无关性像素(dp)值,且布局的维度应该总是被定义使用dp单位,因为关心的是,系统占用屏幕密度后可用屏幕空间的数量。更多关于密度无关性像素的信息,请阅读文中前面提到的Terms and concepts。

新的尺寸限定符的使用


不同能够指定的基于布局的可用空间的资源配置的总结见表2。与传统的屏幕尺寸组(小、标准、大和超大)相比,这些新的限定符提供了更多的控制权在指定的应用程序支持的屏幕尺寸方面。

注:指定的使用这些限定符的尺寸不是实际的屏幕尺寸。相反,在dp单位中的宽度或高度的尺寸对你的activity的窗口是可用的。Android系统可能会使用一些屏幕做系统UI(如屏幕底部的系统栏或顶部的状态栏),所以一些屏幕有可能对于你的布局是不可用的。因此,你申明的尺寸应该是,特别是你的activity需要的尺寸-当申明了系统能提供给你的布局多少空间时,系统会占用任何被系统UI使用的空间。还需要注意的是,工具栏被认为是应用程序窗口空间的一部分,尽管你的布局没有申明,因此,系统会给布局缩减可用空间,在设计时必须考虑到这点。

表2 屏幕尺寸的新配置限定符(Android 3.2中介绍的)

{|style="border-spacing: 0px;margin: 4px 4px; width: 90%; border-left:1px solid #ccc;border-top:1px solid #ccc; "

|-style="background:#DEE8F1; "

! style=“border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px” | Screen configuratione

! style=“border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px” | Qualifier values

! style=“border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px” | Description

|- style=" vertical-align:top;"

| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

smallestWidth

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

swdp

Examples:

sw600dp

sw720dp

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

The fundamental size of a screen, as indicated by the shortest dimension of the available screen area. Specifically, the device’s smallestWidth is the shortest of the screen’s available height and width (you may also think of it as the “smallest possible width” for the screen). You can use this qualifier to ensure that, regardless of the screen’s current orientation, your application’s has at least dps of width available for it UI.

For example, if your layout requires that its smallest dimension of screen area be at least 600 dp at all times, then you can use this qualifer to create the layout resources, res/layout-sw600dp/. The system will use these resources only when the smallest dimension of available screen is at least 600dp, regardless of whether the 600dp side is the user-perceived height or width. The smallestWidth is a fixed screen size characteristic of the device; the device’s smallestWidth does not change when the screen’s orientation changes.

The smallestWidth of a device takes into account screen decorations and system UI. For example, if the device has some persistent UI elements on the screen that account for space along the axis of the smallestWidth, the system declares the smallestWidth to be smaller than the actual screen size, because those are screen pixels not available for your UI.

This is an alternative to the generalized screen size qualifiers (small, normal, large, xlarge) that allows you to define a discrete number for the effective size available for your UI. Using smallestWidth to determine the general screen size is useful because width is often the driving factor in designing a layout. A UI will often scroll vertically, but have fairly hard constraints on the minimum space it needs horizontally. The available width is also the key factor in determining whether to use a one-pane layout for handsets or multi-pane layout for tablets. Thus, you likely care most about what the smallest possible width will be on each device.

|- style=" vertical-align:top;"

| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

Available screen width

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

wdp

Examples:

w720dp

w1024dp

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

Specifies a minimum available width in dp units at which the resources should be used—defined by the value. The system’s corresponding value for the width changes when the screen’s orientation switches between landscape and portrait to reflect the current actual width that’s available for your UI.

This is often useful to determine whether to use a multi-pane layout, because even on a tablet device, you often won’t want the same multi-pane layout for portrait orientation as you do for landscape. Thus, you can use this to specify the minimum width required for the layout, instead of using both the screen size and orientation qualifiers together.

|- style=" vertical-align:top;"

| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

Available screen height

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

hdp

Examples:

h720dp

h1024dp

etc.

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

Specifies a minimum screen height in dp units at which the resources should be used—defined by the value. The system’s corresponding value for the height changes when the screen’s orientation switches between landscape and portrait to reflect the current actual height that’s available for your UI.

Using this to define the height required by your layout is useful in the same way as wdp is for defining the required width, instead of using both the screen size and orientation qualifiers. However, most apps won’t need this qualifier, considering that UIs often scroll vertically and are thus more flexible with how much height is available, whereas the width is more rigid.

|}

虽然使用这些限定符看上去比使用屏幕尺寸组更加复杂,但是当你一旦确定UI的需求后,这实际上应当更简单。当设计UI时,可能关心的主要事情是,应用程序在手机类型的UI和多窗格的平板类型的UI之间切换时的实际尺寸。切换的关键在于特定的设计,也许需要720dp的宽度给平板布局,也许600dp已足够,或者480dp,或者其他位于这之间的数值。使用表2中的限定符,需要掌握布局改变时的精确尺寸。

更多关于这些尺寸配置限定符的讨论,请参阅Providing Resources文档。

配置实例


为了帮助实现一些为不同类型的设备设计的目标,下面是一些典型的屏幕宽度的数值:

  • 320dp:一种典型的手机屏幕 (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, 等等).

  • 480dp: 一种有点像条纹的中间态的平板 (480x800 mdpi).

  • 600dp: 7寸平板 (600x1024 mdpi).

  • 720dp: 10寸平板 (720x1280 mdpi, 800x1280 mdpi, etc).

使用表2中的这些尺寸限定符,应用程序可以在使用任何想要的宽度或高度的平板和手机的不同布局资源间切换。例如,如果平板布局支持的最小可用宽度是600dp,应该提高两套布局:

res/layout/main_activity.xml # 手机适用

res/layout-sw600dp/main_activity.xml #平板适用

在这种情况下,为了使平板布局能用,可用的屏幕空间的最小宽度必须是600dp。

对于其他情况,你要进一步自定义你的UI以区分如7寸和10寸平板的尺寸,可以定义额外的最小宽度布局:

res/layout/main_activity.xml # 适用于手机 (小于600dp的可用宽度)

res/layout-sw600dp/main_activity.xml #适用于7寸平板(大于等于600dp的可用宽度)

res/layout-sw720dp/main_activity.xml # 适用于10寸平板(大于或等于720dp的可用宽度)

请注意,第二套采用的“可用的宽度”限定符wdp。通过这种方式,一个设备可能实际上使用两种布局,这取决于屏幕的方向(如果在一个方向上可用的宽度是至少600dp,在另一个方向上少于600dp)。

如果关心的是可用高度,可以同样使用hdp限定符。或者,如果情况比较特殊,甚至可以结合wdp 和 hdp一起使用。

支持屏幕尺寸的声明


一旦已经实现了不同屏幕尺寸的布局,在manifest文件中声明应用程序支持哪种屏幕也同样重要。

随同新的屏幕尺寸的配置限定符一起,Android3.2引进了新的 manifest元素属性。

android:requiresSmallestWidthDp

:指定需要的最小smallestWidth。smallestWidth是必须能被应用程序的UI利用的屏幕空间的(在dp单位里)最小尺寸。也就是,最短的可用的屏幕的二维尺寸。因此,为了让设备与应用程序兼容,设备的smallestWidth必须大于等于这个值。(通常,不论屏幕当前的方向是什么,你提供的值是你的布局支持的“最小宽度”。

:例如,如果应用程序是为600dp的最小可用宽度的平板类型设备设计的:

:然而,如果应用程序支持所有Android支持的屏幕尺寸(如426dp x 320dp一样小),那么没有必要申明这个属性,因为需要的最小宽度可能在任何设备上都是最小的。

注意:Android并不关心这个属性,因此它不会影响应用程序在运行时的行为。相反,它常常会为应用程序在服务如谷歌播放上进行过滤。然而,谷歌播放目前不支持过滤属性(在Android3.2上),因此,如果应用程序不支持小屏幕,应该继续使用其它尺寸的属性。

android:compatibleWidthLimitDp

:这个属性允许通过指定应用程序支持的最大“最小宽度”将屏幕的兼容模式作为一个用户可选特征。如果设备的可用屏幕最小边大于这个值,用户仍然可以安装应用程序,但是不能在屏幕的兼容模式上运行。默认情况下,屏幕的兼容模式是禁用的,和平常一样,布局会被调整到适合屏幕,但是按钮在系统栏是可用的,它允许用户开启和关闭屏幕的兼容模式。

注:如果应用程序的布局正好适合大屏幕,就没必要使用这个属性。我们建议避免使用这个属性,而不是按照本文档中的建议确保布局适合更大屏幕。

android:largestWidthLimitDp

:这个属性通过指定你的应用程序支持的最大“最小宽度”强制开启屏幕的兼容模式,如果设备的可用屏幕最小边大于这个值,应用程序会运行在屏幕兼容模式上,且用户没有办法去禁用它。

注:如果应用程序的布局正好适合大屏幕,就没必要使用这个属性。我们建议避免使用这个属性,而不是按照本文档中的建议确保你的布局适合更大屏幕。

注意:当在Android3.2或者更高版本上开发时,不应该使用较旧的屏幕尺寸属性并结合上面列出的属性。同时使用新属性和较旧的尺寸属性会导致不可预料的事情发生。

更多关于这些属性的信息,请查阅以上相应的链接。

最佳实践

====

支持多个屏幕的目的是为了创建一个能正常运行,且在任何Android支持的广义的屏幕配置上看起来都很舒服的应用程序。本文的前面章节提供了关于Android如何使应用程序适应屏幕配置和如何在不同屏幕配置上自定义应用程序的外观的信息。这节提供了一些额外的技巧来确保应用程序适用于不同屏幕配置的技术。

下面是关于如何确保你的应用程序能够恰当地显示在不同屏幕上的快速检查清单:

1.当在XML布局文件中指定尺寸时,使用wrap_content, fill_parent, 或者dp单位

2.在应用程序代码中不要使用硬编码的像素值

3.不要使用绝对布局(已被弃用)

4.对不同的屏幕密度采用可替代的位图绘图

下面章节将讲述更多细节。

  • 1.布局尺寸使用wrap_content, fill_parent, 或者 dp单位*

当在XML布局文件中定义视图的android:layout_width和 android:layout_height时,使用wrap_content, fill_parent, 或者 dp单位以保证在当前设备屏幕上能给视图分配一个适当的尺寸。

例如,一个layout_width为100dp的视图在中等密度的屏幕上是100像素,在高密度屏幕上系统将把它调整到150dp,于是视图在屏幕上占用了大致相同的物理空间。

同样地,应该更喜欢用sp(与比例无关的像素)来定义文本的尺寸。Sp比例因子取决于用户的设置和系统调整的尺寸与它为dp调整的相同。

  • 2.在应用程序代码中不要使用硬编码的像素值*

出于性能方面的原因及为了保持代码更简单,Android系统采用像素作为尺寸或坐标值的标准单位。意思是,在代码中,视图的尺寸总是用像素表达,但总基于当前屏幕密度。例如,如果myView.getWidth()函数的返回值是10,在当前屏幕上视图有10个像素宽度,但是在更高密度屏幕的设备上,返回值可能是15.如果在你的应用程序代码中,使用像素值为位图的单位,且该位图不是为当前屏幕密度预先调整的,可能会调整这些在代码中你用以匹配未调整的位图源的像素值。

假设应用程序在运行时巧妙地处理位图或像素值,请参阅下面的章节Additional Density Considerations。

最后

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2019-2021BAT 面试真题解析,我把大厂面试中常被问到的技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。

还有 高级架构技术进阶脑图 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

Android 基础知识点

Java 基础知识点

Android 源码相关分析

常见的一些原理性问题

希望大家在今年一切顺利,进到自己想进的公司,共勉!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

硬编码的像素值*

出于性能方面的原因及为了保持代码更简单,Android系统采用像素作为尺寸或坐标值的标准单位。意思是,在代码中,视图的尺寸总是用像素表达,但总基于当前屏幕密度。例如,如果myView.getWidth()函数的返回值是10,在当前屏幕上视图有10个像素宽度,但是在更高密度屏幕的设备上,返回值可能是15.如果在你的应用程序代码中,使用像素值为位图的单位,且该位图不是为当前屏幕密度预先调整的,可能会调整这些在代码中你用以匹配未调整的位图源的像素值。

假设应用程序在运行时巧妙地处理位图或像素值,请参阅下面的章节Additional Density Considerations。

最后

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2019-2021BAT 面试真题解析,我把大厂面试中常被问到的技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。

还有 高级架构技术进阶脑图 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

Android 基础知识点

Java 基础知识点

Android 源码相关分析

常见的一些原理性问题

[外链图片转存中…(img-UnWcjlZ8-1714834802760)]

希望大家在今年一切顺利,进到自己想进的公司,共勉!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 28
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值