屏幕布局和分辨率
Fire平板电脑有多种屏幕尺寸、像素密度和宽高比。对于应用开发者来说,创建在众多外形规格各异的设备上都能运行并且看起来美观的应用可能会颇有挑战性,特别是从另一款平板电脑或手机上移植应用时。本文档概述了在应用中管理不同Fire平板电脑屏幕的选项和技巧。
保持图标清晰
为了提高与Android的通用性,Fire OS 5和Fire OS 6上的启动程序会显示您在APK中提供的应用图标。这与早期版本的Fire OS有所不同,在这些版本中,启动程序使用了提交应用时上传到开发者门户的应用图标。有关所需图标分辨率和尺寸的信息,请参阅启动程序图标指南。
在您希望应用运行的设备范围内测试您的图标。确保图标提供清晰可识别的图像,以积极方式代表您的品牌。
以下视频就如何管理应用在Fire平板电脑上的显示方式提供了指导。有关视频中介绍的概念的更多信息,请参阅本主题中的使用灵活布局、为不同屏幕提供多种布局和提供多种图形资源部分。
使用灵活的布局
如果您为特定设备的屏幕设计应用,当它在具有不同屏幕尺寸、宽高比或像素密度的设备上运行时,它的外观和行为可能会与您预期的情况不同。具体来说:
- 为具有特定屏幕大小的设备设计的文本和图像可能会无法正确缩放到不同屏幕尺寸,或者在缩放时可能会看起来失真或像素化。
- 在具有不同宽高比的屏幕上,为具有特定宽高比的设备设计的文本和图像可能出现失真或重叠的屏幕元素。
- 为具有特定屏幕密度的设备设计的文本和图像的元素可能会大于或小于您预期的尺寸,这可能会影响应用的外观和行为。
要解决这些问题,请在设计应用时采用灵活的布局。借助灵活的布局,应用的用户界面(UI)能够在运行时动态缩放到不同的屏幕尺寸、密度和宽高比。
可以按照Android最佳实践为多种不同的屏幕类型设计应用,包括:
- 使用设备独立像素(dp)而不是绝对像素来创建布局。在160PPI (mdpi)设备上,dp单位的基线为每像素1dp,但是对于屏幕密度较高的设备,dp单位在运行时会自动放大。另外,对文本使用比例独立像素(sp)。有关更多信息,请参阅使用设备独立像素。
- 使用ConstraintLayout Android类构建UI,以便让UI元素的位置和尺寸与其他元素成比例。避免使用AbsoluteLayout,此类自Android 1.5(API级别3)以来就已被弃用。绝对布局无法在不同屏幕上缩放。有关更多信息,请参阅使用约束布局。
- 在XML布局元素中,不要显式指定宽度和高度;请使用Android属性值wrap_content和match_parent来根据其内容和父元素动态调整元素的大小。有关更多信息,请参阅使用wrap_content和match_parent。
此外,在将应用从较小屏幕移植到较大屏幕时,请考虑完全重新设计应用的用户界面。您可以发挥更大屏幕尺寸的优势,例如,加入更多内容,或者更好地利用纵向和横向模式。
为不同屏幕提供多种布局
要提供在不同类型的屏幕上看起来美观的应用,还有一种方法是为不同屏幕配置定义多个XML布局资源。在运行时,设备上报其配置,然后由Android选择与屏幕相匹配的恰当布局。通过定义多组布局资源,界面可以实现灵活调整,因此只需创建一个应用就能适应不同的屏幕配置。
可通过以下方式定义屏幕配置:
- 通用屏幕尺寸。Android提供了四个通用尺寸限定符:small、medium、large和xlarge。所有Fire平板电脑都被视为xlarge设备。
- 最小屏幕宽度。Android 3.2 (Honeycomb)中添加的最小宽度限定符以dp为单位,定义了平板电脑最短边的宽度。该限定符采用swXXXdp形式,其中XXX是给定的宽度。最小宽度比一般屏幕尺寸限定符更可取,因为前者能够更具体地针对给定的屏幕类型。除Kindle Fire(第1代/2011,基于Android 2.3.3)之外,所有Fire平板电脑都支持最小宽度。有关这些限定符的更多信息,请参阅使用最小宽度限定符。
要为不同屏幕类型定义多个布局,请在res/目录中创建布局目录,其后缀指示通用尺寸或最小宽度限定符。在这些目录中放置这些外形规格的特定布局XML文件。例如,可以在以下两个目录中为使用large尺寸限定符的屏幕尺寸创建默认布局和自定义布局:
res/layout
res/layout-large
最小宽度的布局目录遵循相同的约定。最小宽度限定符以dp为单位,按设备密度缩放。例如,Kindle Fire HDX 7"(第3代/2013)的物理像素宽度为1200像素。其xhdpi密度限定符相当于2.0的比例因子。宽度的dp单位被缩放(除以)2.0,得到最小宽度限定符sw600dp。对于针对Kindle Fire HDX 7"(或其他类似设备)优化的布局,可以使用以下目录:
res/layout-sw600dp
对于每款Fire平板电脑,下表列出了实际屏幕分辨率、通用尺寸限定符、比例因子和最小宽度限定符。有关Fire平板电脑屏幕尺寸的详细信息,请参阅Fire平板电脑设备和功能规格。
平板电脑 | 通用尺寸限定符 | 实际屏幕尺寸 | 缩放系数 | 通用密度 | 实际像素密度 | 最小宽度限定符 |
---|---|---|---|---|---|---|
Fire 7 (2019) | large | 1024px x 600px | 1.0 | mdpi | 171 | sw600dp |
Fire HD 8 (2018) | large | 1280px x 800px | 1.33 | tvdpi | 189 | sw600dp |
Fire HD 10 (2017) | xlarge | 1920px x 1200px | ??? | hdpi | 223 | sw800dp |
Fire 7 (2017) | large | 1024px x 600px | 1.0 | mdpi | 171 | sw600dp |
Fire HD 8 (2017) | large | 1280px x 800px | 1.33 | tvdpi | 189 | sw600dp |
Fire HD 8 (2016) | large | 1280px x 800px | 1.33 | tvdpi | 189 | sw600dp |
Fire HD 10 (2015) | xlarge | 1280px x 800px | 1.0 | mdpi | 149 | sw800dp |
Fire HD 8 (2015) | large | 1280px x 800px | 1.33 | tvdpi | 189 | sw600dp |
Fire HD (2015) | large | 1024px x 600px | 1.0 | mdpi | 171 | sw600dp |
Fire HDX 8.9 (2014) | xlarge | 2560px x 1600px | 2.0 | xhdpi | 339 | sw800dp |
Fire HD 7 (2014) | large | 1280px x 800px | 1.5 | hdpi | 216 | sw533dp |
Fire HD 6 (2014) | large | 1280px x 800px | 1.5 | hdpi | 252 | sw511dp |
Kindle Fire HDX 8.9" (2013) | xlarge | 2560px x 1600px | 2.0 | xhdpi | 339 | sw800dp |
Kindle Fire HDX 7" (2013) | large | 1920px x 1200px | 2.0 | xhdpi | 323 | sw600dp |
Kindle Fire HD 7" (2013) | large | 1280px x 800px | 1.5 | hdpi | 216 | sw533dp |
Kindle Fire HD 8.9" (2012) | xlarge | 1920px x 1200px | 1.5 | hdpi | 254 | sw800dp |
Kindle Fire HD 7" (2012) | large | 1280px x 800px | 1.5 | hdpi | 216 | sw533dp |
Kindle Fire (2012) | large | 1024px x 600px | 1.0 | mdpi | 169 | sw600dp |
Kindle Fire (2011) | large | 1024px x 600px | 1.0 | mdpi | 169 | 不适用 |
请注意,最小宽度不适用于Kindle Fire(第1代/2011),后者基于旧版本的Android。使用默认布局或尺寸限定符为large的布局指定此设备的布局。
提供多种图形资源
在具有不同密度或宽高比的不同屏幕上管理应用的外观时,可绘制位图(包括图标、背景图像和其他图形)构成了格外复杂的问题。如果只为一种屏幕尺寸或类型提供一组位图资源,Android就会自动缩放这些图形以适应设备的需要,结果可能会不太理想。自动缩放可能会导致图形失真、模糊或呈锯齿状,或者导致文本无法辨认。
与布局一样,您可以在res/目录中为图形资源创建多个drawable目录,并针对这些配置优化图形。对于通用和最小宽度限定符(例如res/drawable-large),可以像命名布局那样命名这些drawable目录。此外,Android还提供了特定屏幕密度(每英寸点数)的限定符,这可能对位图更有用。
对于屏幕密度,Android提供了五个限定符:ldpi、mdpi、hdpi、xhdpi和tvdpi(低、中、高、超高和电视)。例如,要提供默认的可绘制对象集以及针对高密度屏幕优化的可绘制对象,请使用以下目录名:
res/drawable
res/drawable-hdpi
还可以将可绘制对象或布局的密度限定符与尺寸或最小宽度进行混合搭配:
res/layout-large-hdpi
res/drawable-sw800dp-hdpi
与布局和屏幕尺寸一样,Android根据设备在运行时上报的配置来选择相应的资源集。
请注意,Android的通用密度限定符会将相似的设备分在一组,方便您为属于同一类的设备创建布局和图形。但是请记住,密度限定符表示近似密度:mdpi为160DPI,hdpi为240DPI。各设备的实际密度可能会略有不同。如果使用这些通用密度,但将用户界面元素构建为具有精确的物理尺寸,则仍有可能达不到预期效果。例如,布局元素可能出现尺寸错误,或者在屏幕上没有对齐。请务必在特定设备上测试您的应用,以确保兼容性。通用密度对应于以下DPI值:
- mdpi: 160
- hdpi: 240
- xhdpi: 320
- tvdpi: 213
在清单中声明对屏幕尺寸的支持
即使遵循了之前定义灵活布局以及提供替代布局和图形资源的指导原则,也应该在Android的清单中声明支持的屏幕尺寸和
例如,要显式指出您的应用仅支持最小宽度为533dp平板电脑(large和xlarge屏幕),请使用以下代码:
<supports-screens
android:smallScreens="false"
android:normalScreens="false"
android:largeScreens="true"
android:xlargeScreens="true"
android:requiresSmallestWidthDp="533"/>
注意: 与资源目录的最小宽度限定符一样,requiresSmallestWidthDp属性仅在Android 3.2或更高版本上可用。因此,它不适用于Kindle Fire(第1代)。
有关
声明支持分屏(多窗口)
分屏模式又称多窗口,此功能可以同时运行两个并排显示或交叠显示的应用。例如,您可以在查看电子邮件的同时观看视频。
如何启用/禁用分屏
在清单的<activity>
或<application>
元素(AndroidManifest.xml
)中设置此属性,以启用或禁用多窗口显示:
android:resizeableActivity=["true" | "false"]
- True: 该Activity可在分屏和自由形式模式下启动。
- False: 该Activity不支持多窗口模式。如果用户试图在多窗口模式下启动该Activity,则该Activity将占据整个屏幕。
在Fire OS 7 (API 28)或更高版本中,此值默认为“true”,除非被特意禁用。
有关配置的更多信息,例如如何指定允许的最小尺寸,请参阅多窗口支持页面。
了解全屏模式对布局有何影响
在Fire平板电脑上,应用可以以三种屏幕模式之一运行:
- 标准模式,其中状态栏和软键栏在屏幕上可见。
- 全屏模式,隐藏状态栏并最小化软键栏。仅显示一个很小的“全屏手柄”。用户点击全屏手柄或从屏幕底部向上轻扫,可查看这两个工具栏。以下示例显示了全屏模式的标记:
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
- 超级全屏模式(Android 4.0,Ice Cream Sandwich、API级别14),其中还隐藏了全屏手柄。屏幕上看不到工具栏。与全屏模式一样,用户可以通过点击屏幕来显示两个工具栏。以下示例显示了超级全屏模式的标记。
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 此标记仅在API级别14及更高版本中可用。
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
}
状态栏和软键栏的可见性可能会对布局产生不同影响,特别是当您将应用设计为全屏模式时。具体来说:
- 在标准模式下,状态栏和软键栏按栏的高度或宽度来置换布局。如果查询布局的尺寸(使用View.getWidth()或View.getHeight()),会看到这些值小于整体显示,因为布局同时考虑到了两个工具栏。
- 在全屏模式下,全屏控制柄绘制在布局顶部。在超级全屏模式下,工具栏或手柄不可见。
- 在两种全屏模式下,当用户点击屏幕以显示工具栏时,状态栏和软键栏均绘制在布局顶部,并遮盖住位于其下方的所有元素。布局的尺寸不会更改。在这种情况下,如果查询布局的尺寸,Fire平板电脑将返回屏幕的整体尺寸。
应用无法控制工具栏是否以全屏模式显示;该行为由用户决定。如果应用布局需要始终全屏显示(包括显示工具栏时),则应调整布局,以将工具栏的尺寸考虑在内。在用户体验规格中可以找到每款Kindle Fire平板电脑的状态栏和软键栏的尺寸。
Last updated: 2021年4月27日