简书链接:androidpad适配屏幕适配相关资料
文章字数:10559,阅读全文大约需要42分钟

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
例如:(取两个尺寸的最短者)

https://developer.android.google.cn/guide/practices/screens_support
https://blog.csdn.net/qq_27570955/article/details/53207600
设备1024x480mdpi=sw480dp

设备1024x600mdpi=sw600dp

设备480x600mdpi =sw480dp

设备480x640mdpi=sw480dp

设备2560x1440mdpi=sw1440dp


ldpi(低)~120dpi
mdpi(中)~160dpi
hdpi(高)~240dpi
xhdpi(超高)~320dpi
xxhdpi(超超高)~480dpi
xxxhdpi(超超超高)~640dpi

2-4英寸 small nromal 3.5-4.5
4-7 英寸 large 7-10英寸 xlarge

超大屏幕至少为 960dp x 720dp
大屏幕至少为 640dp x 480dp
正常屏幕至少为 470dp x 320dp
小屏幕至少为 426dp x 320dp

<supports-screens android:resizeable=["true"| "false"]
android:smallScreens=["true" | "false"]
android:normalScreens=["true" | "false"]
android:largeScreens=["true" | "false"]
android:xlargeScreens=["true" | "false"]
android:anyDensity=["true" | "false"]
android:requiresSmallestWidthDp="integer"
android:compatibleWidthLimitDp="integer"
android:largestWidthLimitDp="integer"/>

可用于提供尺寸特定资源的配置限定符包括 small、normal、large 和 xlarge。例如,超大屏幕的布局应使用 layout-xlarge/。
从 Android 3.2(API 级别 13)开始,以上尺寸组已弃用,您 应改为使用 sw<N>dp 配置限定符来定义布局资源 可用的最小宽度。例如,如果多窗格平板电脑布局 需要至少 600dp 的屏幕宽度,应将其放在 layout-sw600dp/ 中。声明适用于 Android 3.2 的平板电脑布局一节将进一步讨论如何使用新技术声明布局资源。




Tablet设备常见的屏幕宽度值:

sw320dp:常见手机屏幕。(240x320ldpi、320x480mdpi、480x800hdpi等)

计算过程:480x800hdpi的最小宽度是480hdpi,换算成dp就是480hdpi*0.75=320dp。同理,240x320ldpi最小宽度是240ldpi,换算成dp单位240ldpi/0.75=320dp。

mdpi是基准,1mdpi=1dp;1ldpi=0.75dp;1hdpi=1.5dp;1xhdpi=2dp;1xxhdpi=3dp;1xxxhdpi=4dp。对这个公式不熟的看前一篇Android多屏幕适配-手机

sw480dp:中间平板电脑,例如Streak(480x800mdpi)

sw600dp:7英寸平板电脑(600x1024mdpi)

sw720dp:10英寸平板电脑(720x1280mdpi、800x1280mdpi等)




可用于密度特定资源的配置限定符(在下面详述) 包括 ldpi(低)、mdpi(中)、 hdpi(高)、xhdpi(超高)、xxhdpi (超超高)和 xxxhdpi(超超超高)。例如,高密度屏幕的位图应使用 drawable-hdpi/。
4、使用示例


尺寸 small 适用于小尺寸屏幕的资源。
normal 适用于正常尺寸屏幕的资源。(这是基线尺寸。)
large 适用于大尺寸屏幕的资源。
xlarge 适用于超大尺寸屏幕的资源。
密度 ldpi 适用于低密度 (ldpi) 屏幕 (~120dpi) 的资源。
mdpi 适用于中密度 (mdpi) 屏幕 (~160dpi) 的资源。(这是基线 密度。)
hdpi 适用于高密度 (hdpi) 屏幕 (~240dpi) 的资源。
xhdpi 适用于超高密度 (xhdpi) 屏幕 (~320dpi) 的资源。
xxhdpi 适用于超超高密度 (xxhdpi) 屏幕 (~480dpi) 的资源。
xxxhdpi 适用于超超超高密度 (xxxhdpi) 屏幕 (~640dpi) 的资源。此限定符仅适用于 启动器图标,请参阅上面的注。
nodpi 适用于所有密度的资源。这些是密度独立的资源。不管当前屏幕的密度如何,系统都不会 缩放以此限定符标记的资源。
tvdpi 适用于密度介于 mdpi 和 hdpi 之间屏幕(约为 213dpi)的资源。它并不是 “主要”密度组,主要用于电视,而大多数应用都不 需要它 — 对于大多数应用而言,提供 mdpi 和 hdpi 资源便已足够,系统将根据需要对其进行 缩放。如果发现必须提供 tvdpi 资源,应以 1.33*mdpi 的系数 调整其大小。例如,mdpi 屏幕的 100px x 100px 图像应该相当于 tvdpi 的 133px x 133px。
方向 land 适用于横屏(长宽比)的资源。
port 适用于竖屏(高宽比)的资源。
纵横比 long 适用于纵横比明显高于或宽于(分别在竖屏 或横屏时)基线屏幕配置的屏幕的资源。
notlong 适用于使用纵横比类似于基线屏幕 配置的屏幕的资源。


图标设置指南
https://developer.android.google.cn/guide/practices/ui_guidelines/icon_design
36x36 (0.75x) 用于低密度
48x48(1.0x 基线)用于中密度mhdpi
72x72 (1.5x) 用于高密度 hdpi
96x96 (2.0x) 用于超高密度 xhdpi
144x144 (3.0x) 用于超超高密度 xxhdpi
192x192 (4.0x) 用于超超超高密度xxxhdpi(仅限启动器图标;请参阅上面的 注)




o Mountain View, CA on November 7-8, 2018.
支持多种屏幕
Android 可在各种具有不同屏幕尺寸和密度的设备上运行。对于应用,Android 系统在不同设备中提供一致的开发环境,可以处理大多数工作,将每个应用的用户界面调整为适应其显示的屏幕。 同时,系统提供 API,可用于控制应用适用于特定屏幕尺寸和密度的 UI,以针对不同屏幕配置优化 UI 设计。 例如,您可能想要不同于手机 UI 的平板电脑 UI。

虽然系统为使您的应用适用于不同的屏幕,会进行缩放和大小调整,但您应针对不同的屏幕尺寸和密度优化应用。 这样可以最大程度优化所有设备上的用户体验,用户会 认为您的应用实际上是专为他们的设备而设计,而不是 简单地拉伸以适应其设备屏幕。

按照本文档所述的做法,您可以创建 正常显示的应用,然后使用 一个 .apk 文件在所有支持的屏幕配置中提供优化的用户体验。

注:本文档中的信息假设您的 应用设计用于 Android 1.6(API 级别 4)或更高级别。如果您的应用只支持 Android 1.5 或更低版本,请先阅读适用于 Android 1.5 的策略。

另请注意,Android 3.2 引入了新的 API,可用于更 精确地控制应用用于不同屏幕尺寸的布局资源。如果您要开发针对平板电脑优化的应用,这些新 功能特别重要。 有关详情,请参阅声明 Android 3.2 的平板电脑布局相关章节。

屏幕支持概览
本节概述 Android 对多种屏幕的支持,包括: 本文档和 API 中所用术语和概述的简介、 系统支持的屏幕配置摘要,以及 API 和基本 屏幕兼容性功能的概述。

术语和概念
屏幕尺寸
按屏幕对角测量的实际物理尺寸。
为简便起见,Android 将所有实际屏幕尺寸分组为四种通用尺寸:小、 正常、大和超大。

屏幕密度
屏幕物理区域中的像素量;通常称为 dpi(每英寸 点数)。例如, 与“正常”或“高”密度屏幕相比,“低”密度屏幕在给定物理区域的像素较少。
为简便起见,Android 将所有屏幕密度分组为六种通用密度: 低、中、高、超高、超超高和超超超高。

方向
从用户视角看屏幕的方向,即横屏还是 竖屏,分别表示屏幕的纵横比是宽还是高。请注意, 不仅不同的设备默认以不同的方向操作,而且 方向在运行时可随着用户旋转设备而改变。
分辨率
屏幕上物理像素的总数。添加对多种屏幕的支持时, 应用不会直接使用分辨率;而只应关注通用尺寸和密度组指定的屏幕 尺寸及密度。
密度无关像素 (dp)
在定义 UI 布局时应使用的虚拟像素单位,用于以密度无关方式表示布局维度 或位置。
密度无关像素等于 160 dpi 屏幕上的一个物理像素,这是 系统为“中”密度屏幕假设的基线密度。在运行时,系统 根据使用中屏幕的实际密度按需要以透明方式处理 dp 单位的任何缩放 。dp 单位转换为屏幕像素很简单: px = dp * (dpi / 160)。 例如,在 240 dpi 屏幕上,1 dp 等于 1.5 物理像素。在定义应用的 UI 时应始终使用 dp 单位 ,以确保在不同密度的屏幕上正常显示 UI。

支持的屏幕范围
从 Android 1.6(API 级别 4)开始,Android 支持多种屏幕尺寸和密度,反映设备可能具有的多种不同屏幕配置。 您可以使用 Android 系统的功能优化应用在各种屏幕配置下的用户界面 ,确保应用不仅正常渲染,而且在每个屏幕上提供 最佳的用户体验。

为简化您为多种屏幕设计用户界面的方式,Android 将实际屏幕尺寸和密度的范围 分为:

四种通用尺寸:小、正常、 大 和超大
注:从 Android 3.2(API 级别 13)开始,这些尺寸组 已弃用,而采用根据可用屏幕宽度管理屏幕尺寸的 新技术。如果为 Android 3.2 和更高版本开发,请参阅声明适用于 Android 3.2 的平板电脑布局以了解更多信息。

六种通用的密度:
ldpi(低)~120dpi
mdpi(中)~160dpi
hdpi(高)~240dpi
xhdpi(超高)~320dpi
xxhdpi(超超高)~480dpi
xxxhdpi(超超超高)~640dpi
通用的尺寸和密度按照基线配置(即正常尺寸和 mdpi(中)密度)排列。 此基线基于第一代 Android 设备 (T-Mobile G1) 的屏幕配置,该设备采用 HVGA 屏幕(在 Android 1.6 之前,这是 Android 支持的唯一屏幕配置)。

每种通用的尺寸和密度都涵盖一个实际屏幕尺寸和密度范围。例如, 两部都报告正常屏幕尺寸的设备在手动测量时,实际屏幕尺寸和 高宽比可能略有不同。类似地,对于两台报告 hdpi 屏幕密度的设备,其实际像素密度可能略有不同。 Android 将这些差异抽象概括到应用,使您可以提供为通用尺寸和密度设计的 UI,让系统按需要处理任何最终调整。 图 1 说明不同的尺寸和密度如何粗略归类为不同的尺寸 和密度组。


图 1. 说明 Android 如何将实际尺寸和密度粗略地 对应到通用的尺寸和密度(数据并不精确)。

在为不同的屏幕尺寸设计 UI 时,您会发现每种设计都需要 最小空间。因此,上述每种通用的屏幕尺寸都关联了系统定义的最低 分辨率。这些最小尺寸以“dp”单位表示 — 在定义布局时应使用相同的单位 — 这样系统无需担心屏幕密度的变化。

超大屏幕至少为 960dp x 720dp
大屏幕至少为 640dp x 480dp
正常屏幕至少为 470dp x 320dp
小屏幕至少为 426dp x 320dp
注:这些最小屏幕尺寸在 Android 3.0 之前未正确定义,因此某些设备在正常屏幕与大屏幕之间变换时可能会出现分类错误的情况。 这些尺寸还基于屏幕的物理分辨率,因此设备之间可能不同 — 例如,具有系统状态栏的 1024x720 平板电脑因系统状态栏要占用空间,所以可供 应用使用的空间要小一点。

要针对不同的屏幕尺寸和密度优化应用的 UI,可为任何通用的尺寸和密度提供备用资源。 通常,应为某些不同的屏幕尺寸提供替代布局,为不同的屏幕密度提供替代位图图像。 在运行时,系统会根据当前设备屏幕的通用 尺寸或密度对应用使用适当的资源。

无需为屏幕尺寸和 密度的每个组合提供备用资源。系统提供强大的兼容性功能,可处理在任何设备屏幕上 渲染应用的大多数工作,前提是您已经使用 可以适当调整大小的技术实现 UI(如下面的最佳做法所述)。

注:定义设备通用屏幕 尺寸和密度的特性相互独立。例如,WVGA 高密度屏幕 被视为正常尺寸屏幕,因为其物理尺寸与 T-Mobile G1 (Android 的第一代设备和基线屏幕配置)大约相同。另一方面,WVGA 中密度 屏幕被视为大尺寸屏幕。虽然它提供相同的分辨率(相同的 像素数),但 WVGA 中密度屏幕的屏幕密度更低,意味着每个像素 实际上更大,因此整个屏幕大于基线(正常尺寸)屏幕。

密度独立性
应用显示在密度不同的屏幕上时,如果它保持用户界面元素的物理尺寸(从 用户的视角),便可实现“密度独立性” 。

保持密度独立性很重要,因为如果没有此功能,UI 元素(例如 按钮)在低密度屏幕上看起来较大,在高密度屏幕上看起来较小。这些 密度相关的大小变化可能给应用布局和易用性带来问题。图 2 和 3 分别显示了应用不提供密度独立性和 提供密度独立性时的差异。


图 2. 不支持不同密度的示例应用在低、中、高密度屏幕上的显示情况。


图 3. 良好支持不同密度(密度独立)的示例应用在低、中、高密度屏幕上的显示情况。

Android 系统可帮助您的应用以两种方式实现密度独立性:

系统根据当前屏幕密度扩展 dp 单位数
系统在必要时可根据当前屏幕 密度将可绘制对象资源扩展到适当的大小
在图 2 中,文本视图和位图可绘制对象具有以像素(px 单位)指定的尺寸,因此视图的物理尺寸在低密度屏幕上更大,在高密度 屏幕上更小。这是因为,虽然实际屏幕尺寸可能相同,但高密度屏幕 的每英寸像素更多(同样多的像素在一个更小的区域内)。在图 3 中,布局 尺寸以密度独立的像素(dp 单位)指定。由于 密度独立像素的基线是中密度屏幕,因此具有中密度屏幕的设备看起来 与图 2 一样。但对于低密度和高密度屏幕,系统 将分别增加和减少密度独立像素值,以适应 屏幕。

大多数情况下,确保应用中的屏幕独立性很简单,只需以适当的密度独立像素(dp 单位)或 "wrap_content" 指定所有 布局尺寸值。系统然后根据适用于当前屏幕密度的缩放比例适当地缩放位图可绘制对象,以 适当的大小显示。

但位图缩放可能导致模糊或像素化位图,您或许已经在上面的屏幕截图中 发现了这些问题。为避免这些伪影,应为 不同的密度提供替代的位图资源。例如,应为高密度 屏幕提供分辨率较高的位图,然后系统对中密度 屏幕将使用这些位图,而无需调整位图大小。下一节详细说明如何为 不同的屏幕配置提供备用资源。

如何支持多种屏幕
Android 支持多种屏幕的基础是它能够管理针对当前屏幕配置 以适当方式渲染应用的布局和位图 可绘制对象。系统可处理大多数工作,通过适当地 缩放布局以适应屏幕尺寸/密度和根据屏幕密度缩放位图可绘制对象 ,在每种屏幕配置中渲染您的应用。但是,为了更适当地处理不同的屏幕配置 ,还应该:

在清单中显式声明您的应用 支持哪些屏幕尺寸
通过声明您的应用支持哪些屏幕尺寸,可确保只有 其屏幕受支持的设备才能下载您的应用。声明对 不同屏幕尺寸的支持也可影响系统如何在较大 屏幕上绘制您的应用 — 特别是,您的应用是否在屏幕兼容模式中运行。

要声明应用支持的屏幕尺寸,应在清单文件中包含 <supports-screens> 元素。

为不同屏幕尺寸提供不同的布局
默认情况下,Android 会调整应用布局的大小以适应当前设备屏幕。大多数 情况下效果很好。但有时 UI 可能看起来不太好,需要针对 不同的屏幕尺寸进行调整。例如,在较大屏幕上,您可能要调整 某些元素的位置和大小,以利用其他屏幕空间,或者在较小屏幕上, 可能需要调整大小以使所有内容纳入屏幕。

可用于提供尺寸特定资源的配置限定符包括 small、normal、large 和 xlarge。例如,超大屏幕的布局应使用 layout-xlarge/。

从 Android 3.2(API 级别 13)开始,以上尺寸组已弃用,您 应改为使用 sw<N>dp 配置限定符来定义布局资源 可用的最小宽度。例如,如果多窗格平板电脑布局 需要至少 600dp 的屏幕宽度,应将其放在 layout-sw600dp/ 中。声明适用于 Android 3.2 的平板电脑布局一节将进一步讨论如何使用新技术声明布局资源。

为不同屏幕密度提供不同的位图可绘制对象
默认情况下,Android 会缩放位图可绘制对象(.png、.jpg 和 .gif 文件)和九宫格可绘制对象(.9.png 文件),使它们以适当的 物理尺寸显示在每部设备上。例如,如果您的应用只为 基线中密度屏幕 (mdpi) 提供位图可绘制对象,则在高密度 屏幕上会增大位图,在低密度屏幕上会缩小位图。这种缩放可能在 位图中造成伪影。为确保位图的最佳显示效果,应针对 不同屏幕密度加入不同分辨率的替代版本。

可用于密度特定资源的配置限定符(在下面详述) 包括 ldpi(低)、mdpi(中)、 hdpi(高)、xhdpi(超高)、xxhdpi (超超高)和 xxxhdpi(超超超高)。例如,高密度屏幕的位图应使用 drawable-hdpi/。

注:仅当要在 xxhdpi 设备上提供比正常位图大的启动器图标时才需要提供 mipmap-xxxhdpi 限定符。无需为所有应用的图像提供 xxxhdpi 资源。

有些设备会将启动器图标增大 25%。例如,如果您的最高 密度启动器图标已是超超高密度,缩放处理会降低其 清晰度。因此应在 mipmap-xxxhdpi 目录中提供更高密度的启动器图标,系统将改为增大较小 的图标。

请参阅提供 xxx-高密度启动器图标以了解详细信息。对启动程序图标以外的 UI 元素不应使用 xxxhdpi 限定符。

注:将您的所有启动器图标放在 res/mipmap-[density]/ 文件夹中,而非 res/drawable-[density]/ 文件夹中。无论安装应用的设备屏幕分辨率如何,Android 系统都会将资源保留在这些密度特定的文件夹中,例如 mipmap-xxxhdpi。此 行为可让启动器应用为您的应用选择要显示在主 屏幕上的最佳分辨率图标。如需了解有关使用 mipmap 文件夹的详细信息,请参阅管理项目概览。

尺寸和密度配置限定符对应于 前面支持的屏幕范围中所述的通用尺寸和密度。

注:如果不熟悉配置限定符以及 系统如何使用它们来应用备用资源,请参阅提供备用资源了解详细信息。

在运行时,系统通过 以下程序确保任何给定资源在当前屏幕上都能保持尽可能最佳的显示效果:

系统使用适当的备用资源
根据当前屏幕的尺寸和密度,系统将使用您的应用中提供的任何尺寸和 密度特定资源。例如,如果设备有 高密度屏幕,并且应用请求可绘制对象资源,系统将查找 与设备配置最匹配的可绘制对象资源目录。根据可用的其他 备用资源,包含 hdpi 限定符(例如 drawable-hdpi/)的资源目录可能是最佳匹配项,因此系统将使用此 目录中的可绘制对象资源。

如果没有匹配的资源,系统将使用默认资源,并按需要向上 或向下扩展,以匹配当前的屏幕尺寸和密度。
“默认”资源是指未标记配置限定符的资源。例如,drawable/ 中的资源是默认可绘制资源。 系统假设默认资源设计用于基线屏幕尺寸和密度,即 正常屏幕尺寸和中密度。 因此,系统对于高密度屏幕向上扩展默认密度 资源,对于低密度屏幕向下扩展。

当系统查找密度特定的资源但在 密度特定目录中未找到时,不一定会使用默认资源。系统在缩放时可能 改用其他密度特定资源提供更好的 效果。例如,查找低密度资源但该资源不可用时, 系统会缩小资源的高密度版本,因为 系统可轻松以 0.5 为系数将高密度资源缩小至低密度资源,与以 0.75 为系数 缩小中密度资源相比,伪影更少。

如需有关 Android 如何通过使配置限定符与设备配置匹配来选择备用资源的更多信息,请参阅Android 如何查找最佳匹配资源。

使用配置限定符
Android 支持多种配置限定符,可让您控制系统 如何根据当前设备屏幕的特性选择备用资源。配置限定符是可以附加到 Android 项目中资源目录的字符串,用于指定在其中设计资源的配置。

要使用配置限定符:

在项目的 res/ 目录中新建一个目录,并使用以下 格式命名: <resources_name>-<qualifier>
<resources_name> 是标准资源名称(例如 drawable 或 layout)。
<qualifier> 是下表 1 中的配置限定符,用于指定 要使用这些资源的屏幕配置(例如 hdpi 或 xlarge)。
您可以一次使用多个 <qualifier> — 只需使用短划线分隔每个 限定符。

将适当的配置特定资源保存在此新目录下。这些资源 文件的名称必须与默认资源文件完全一样。
例如,xlarge 是超大屏幕的配置限定符。将 此字符串附加到资源目录名称(例如 layout-xlarge)时,它指向 要在具有超大屏幕的设备上使用这些资源的系统。

表 1. 可用于为 不同屏幕配置提供特殊资源的配置限定符。

屏幕特性 限定符 说明
尺寸 small 适用于小尺寸屏幕的资源。
normal 适用于正常尺寸屏幕的资源。(这是基线尺寸。)
large 适用于大尺寸屏幕的资源。
xlarge 适用于超大尺寸屏幕的资源。
密度 ldpi 适用于低密度 (ldpi) 屏幕 (~120dpi) 的资源。
mdpi 适用于中密度 (mdpi) 屏幕 (~160dpi) 的资源。(这是基线 密度。)
hdpi 适用于高密度 (hdpi) 屏幕 (~240dpi) 的资源。
xhdpi 适用于超高密度 (xhdpi) 屏幕 (~320dpi) 的资源。
xxhdpi 适用于超超高密度 (xxhdpi) 屏幕 (~480dpi) 的资源。
xxxhdpi 适用于超超超高密度 (xxxhdpi) 屏幕 (~640dpi) 的资源。此限定符仅适用于 启动器图标,请参阅上面的注。
nodpi 适用于所有密度的资源。这些是密度独立的资源。不管当前屏幕的密度如何,系统都不会 缩放以此限定符标记的资源。
tvdpi 适用于密度介于 mdpi 和 hdpi 之间屏幕(约为 213dpi)的资源。它并不是 “主要”密度组,主要用于电视,而大多数应用都不 需要它 — 对于大多数应用而言,提供 mdpi 和 hdpi 资源便已足够,系统将根据需要对其进行 缩放。如果发现必须提供 tvdpi 资源,应以 1.33*mdpi 的系数 调整其大小。例如,mdpi 屏幕的 100px x 100px 图像应该相当于 tvdpi 的 133px x 133px。
方向 land 适用于横屏(长宽比)的资源。
port 适用于竖屏(高宽比)的资源。
纵横比 long 适用于纵横比明显高于或宽于(分别在竖屏 或横屏时)基线屏幕配置的屏幕的资源。
notlong 适用于使用纵横比类似于基线屏幕 配置的屏幕的资源。
注:如果是为 Android 3.2 和 更高版本开发应用,请参阅有关声明适用于 Android 3.2 的平板电脑布局的章节,了解 在为特定屏幕尺寸声明布局资源时应使用的 新配置限定符(而不是使用表 1 中的尺寸限定符)。

如需了解有关这些限定符如何粗略地对应于实际屏幕 尺寸和密度的更多信息,请参阅本文档前面的支持的屏幕范围 。

例如,以下应用资源目录 为不同屏幕尺寸和不同可绘制对象提供不同的布局设计。使用 mipmap/ 文件夹放置 启动器图标。

res/layout/my_layout.xml // layout for normal screen size ("default")
res/layout-large/my_layout.xml // layout for large screen size
res/layout-xlarge/my_layout.xml // layout for extra-large screen size
res/layout-xlarge-land/my_layout.xml // layout for extra-large in landscape orientation

res/drawable-mdpi/graphic.png // bitmap for medium-density
res/drawable-hdpi/graphic.png // bitmap for high-density
res/drawable-xhdpi/graphic.png // bitmap for extra-high-density
res/drawable-xxhdpi/graphic.png // bitmap for extra-extra-high-density

res/mipmap-mdpi/my_icon.png // launcher icon for medium-density
res/mipmap-hdpi/my_icon.png // launcher icon for high-density
res/mipmap-xhdpi/my_icon.png // launcher icon for extra-high-density
res/mipmap-xxhdpi/my_icon.png // launcher icon for extra-extra-high-density
res/mipmap-xxxhdpi/my_icon.png // launcher icon for extra-extra-extra-high-density
如需了解如何使用备用资源的更多信息以及 配置限定符的完整列表(不只是屏幕配置),请参阅 提供备用资源。

请注意,当 Android 系统在运行时选择使用哪些资源时,它会使用 特定逻辑确定“最佳匹配”资源。也就是说,您使用的限定符无 需在所有情况下精确匹配当前屏幕配置,系统也可 使用它们。特别是,根据屏幕尺寸限定符选择资源时,如果没有更好的匹配资源,则系统将 使用专为小于当前屏幕的屏幕而设计的 资源(例如,如有必要,大尺寸屏幕将使用标准尺寸的屏幕 资源)。但是,如果唯一可用的资源大于当前屏幕, 则系统不会使用这些资源,并且如果没有其他资源与设备 配置匹配,应用将会崩溃(例如,如果所有布局资源均用 xlarge 限定符标记, 但设备是标准尺寸的屏幕)。如需有关系统如何选择资源的更多信息,请参阅Android 如何查找最佳匹配资源。

提示:如果您有一些系统 应该永远不会缩放(或许是因为您在 运行时亲自对图像做一些调整)的可绘制对象资源,则应将它们放在有 nodpi 配置限定符的目录中。 使用此限定符的资源被视为与密度无关,系统不会缩放 它们。

设计替代布局和可绘制对象
您应该创建的备用资源类型取决于应用的需求。 通常,您应该使用尺寸和方向限定符提供替代布局资源 ,并且使用密度限定符提供替代位图可绘制对象资源。

以下各节摘要说明您可能要如何使用尺寸和密度限定符 来分别提供替代布局和可绘制对象。

替代布局
一般而言,在不同的屏幕配置上测试应用后,您会知道 是否需要用于不同屏幕尺寸的替代布局。例如:

在小屏幕上测试时,可能会发现您的布局不太适合 屏幕。例如,小屏幕设备的屏幕宽度可能无法容纳一排 按钮。在此情况下,您应该为小屏幕提供调整 按钮大小或位置的替代布局。
在超大屏幕上测试时,可能会发现您的布局无法 有效地利用大屏幕,并且明显拉伸填满屏幕。 在此情况下,您应该为超大屏幕提供替代布局,以提供 针对大屏幕(例如平板电脑)优化、重新设计的 UI。
虽然您的应用不使用替代布局也能在大屏幕上正常运行,但 必须让用户感觉您的应用看起来像是专为其 设备而设计。如果 UI 明显拉伸,用户很可能对 应用体验不满意。

而且,对比横屏测试和竖屏测试时 可能会发现,竖屏时置于底部的 UI 在横屏时应位于屏幕右侧。
简而言之,您应确保应用布局:

适应小屏幕(让用户能实际使用您的应用)
已针对大屏幕优化,可以利用其他屏幕空间
已同时针对横屏和竖屏方向优化
如果 UI 使用的位图即使在系统缩放 布局后也需要适应视图大小(例如按钮的背景图片),则应使用九宫格位图文件。九宫格文件基本上是一个指定可拉伸的二维区域的 PNG 文件。 当系统需要缩放使用位图的视图时,系统 会拉伸九宫格位图,但只拉伸指定的区域。因此,您无 需为不同的屏幕尺寸提供不同的可绘制对象,因为九宫格位图可 调整至任何大小。但您应该为不同的屏幕密度提供 九宫格文件的替代版本。

替代可绘制对象

图 4. 支持每种密度的 位图可绘制对象的相对大小。

基本上每个应用都应该具有不同密度的替代可绘制对象 资源,因为基本上每个应用都有启动器图标,而且该图标应该在 所有屏幕密度中看起来都很好。同样,如果您的应用中包含其他位图可绘制对象(例如 应用中的菜单图标或其他图形),则应该为不同密度提供替代版本或 每种密度一个版本。

注:您只需要为 位图文件(.png、.jpg 或 .gif)和九宫格文件 (.9.png) 提供密度特定的可绘制对象。如果您使用 XML 文件定义形状、颜色或其他可绘制对象资源,应该 将一个副本放在默认可绘制对象目录中 (drawable/)。

要为不同的密度创建替代位图可绘制对象,应遵循六种通用密度之间的 3:4:6:8:12:16 缩放比率。例如,如果您的 位图可绘制对象是对中密度屏幕使用 48x48 像素,则所有不同的尺寸应为:

36x36 (0.75x) 用于低密度
48x48(1.0x 基线)用于中密度
72x72 (1.5x) 用于高密度
96x96 (2.0x) 用于超高密度
144x144 (3.0x) 用于超超高密度
192x192 (4.0x) 用于超超超高密度(仅限启动器图标;请参阅上面的 注)
如需了解有关设计图标的更多信息,请参阅图标设计指南, 其中包含各种位图可绘制对象(例如启动器图标、菜单 图标、状态栏图标、选项卡图标等)的大小信息。




声明适用于 Android 3.2 的平板电脑布局
对于第一代运行 Android 3.0 的平板电脑,声明平板电脑 的正确方式是将它们放在有 xlarge 配置限定符的目录(例如 res/layout-xlarge/)中。为适应其他类型的平板电脑和屏幕 尺寸 — 特别是 7 英寸平板电脑 — Android 3.2 引入了为更具体的屏幕尺寸指定资源 的新方式。新技术基于布局需要的空间量 (例如 600dp 宽),而不是尝试让您的布局容纳通用化的尺寸组 (例如大或超大)。

使用通用化的尺寸组时,为 7 英寸平板电脑设计很棘手的原因在于, 7 英寸平板电脑在技术上与 5 英寸手机属于同一个组(大组)。虽然 这两种设备在尺寸上似乎很接近,但用于 应用 UI 的空间量明显不同,用户交互的方式也是如此。因此,7 英寸和 5 英寸 屏幕不一定使用相同的布局。为便于您为这两种屏幕提供不同的 布局,Android 现在允许您 根据实际适用于应用布局的宽度和/或高度指定布局资源( 以 dp 单位数指定)。

例如,在设计要用于平板电脑样式设备的布局之后,您可能 发现该布局在屏幕宽度小于 600dp 时不适用。此阈值 于是变成平板电脑布局需要的最小尺寸。因此,您现在可以指定应仅当至少有 600dp 宽度供应用的 UI 使用时才使用这些布局资源。

应选择一个宽度并将其设计为最小尺寸,或者在布局设计完成后测试 其支持的最小宽度。









smallestWidth sw<N>dp

示例:
sw600dp
sw720dp
屏幕的基本尺寸,由可用屏幕区域的最小尺寸指定。 具体来说,设备的 smallestWidth 是屏幕可用高度和宽度的最小尺寸(您也可以将其视为屏幕的“最小可能宽度”)。无论屏幕的当前方向如何,您均可使用此限定符确保应用 UI 的可用宽度至少为 <N>dp。

例如,如果布局要求屏幕区域的最小尺寸始终至少为 600 dp,则可使用此限定符创建布局资源 res/layout-sw600dp/。仅当可用屏幕的最小尺寸至少为 600dp 时,系统才会使用这些资源,而不考虑 600dp 所代表的边是用户所认为的高度还是宽度。smallestWidth 是设备的固定屏幕尺寸特性;设备的 smallestWidth 不会随屏幕方向的变化而改变。

设备的 smallestWidth 将屏幕装饰元素和系统 UI 考虑在内。例如,如果设备的屏幕上有一些永久性 UI 元素占据沿 smallestWidth 轴的空间,则系统会声明 smallestWidth 小于实际屏幕尺寸,因为这些屏幕像素不适用于您的 UI。

这可替代通用化的屏幕尺寸限定符(小、正常、大、超大), 可让您为 UI 可用的有效尺寸定义不连续的数值。 使用 smallestWidth 定义一般屏幕尺寸很有用,因为宽度 通常是设计布局时的驱动因素。UI 经常会垂直滚动,但 对其水平需要的最小空间具有非常硬性的限制。可用的宽度也是 确定是否对手机使用单窗格布局或是对平板电脑使用多窗格布局 的关键因素。因此,您可能最关注每部 设备上的最小可能宽度。

可用屏幕宽度 w<N>dp

示例:
w720dp
w1024dp
指定资源应该使用的最小可用宽度(dp 单位) — 由 <N> 值定义。当屏幕的方向在横屏与竖屏之间切换时,系统对应的 宽度值将会变化,以 反映 UI 可用的当前实际宽度。

这对于确定是否使用多窗格布局往往很有用,因为即使是在 平板电脑设备上,您也通常不希望竖屏像横屏一样 使用多窗格布局。因此,您可以使用此功能指定布局需要的最小宽度,而 无需同时使用屏幕尺寸和方向限定符。

可用屏幕高度 h<N>dp

示例:
h720dp
h1024dp
等等
指定资源应该使用的最小屏幕高度(dp 单位) — 由 <N> 值定义。当屏幕的方向在横屏与竖屏之间切换时,系统 对应的高度值将会变化,以 反映 UI 可用的当前实际高度。

使用此方式定义 布局需要的高度很有用,它与使用 w<N>dp 定义 所需宽度的方式相同,无需同时使用屏幕尺寸和方向限定符。 但大多数应用不需要此限定符,考虑到 UI 经常垂直滚动, 因此高度更弹性,而宽度更刚性。








配置示例
为帮助您针对不同的设备类型确定某些设计,下面提供了一些 常见的屏幕宽度值:

320dp:常见手机屏幕(240x320 ldpi、320x480 mdpi、480x800 hdpi 等)。
480dp:中间平板电脑,例如 Streak (480x800 mdpi)。
600dp:7 英寸平板电脑 (600x1024 mdpi)。
720dp:10 英寸平板电脑(720x1280 mdpi、800x1280 mdpi 等)。




对于要进一步自定义 UI 以区分不同尺寸 (例如 7 英寸和 10 英寸平板电脑)的其他情况,您可以定义其他最小宽度布局:


res/layout/main_activity.xml # For handsets (smaller than 600dp available width)
res/layout-sw600dp/main_activity.xml # For 7” tablets (600dp wide and bigger)
res/layout-sw720dp/main_activity.xml # For 10” tablets (720dp wide and bigger)


只适配平板的方法

例如,如果您的应用只用于最小可用宽度为 600dp 的平板电脑样式设备:

<manifest ... >
<supports-screens android:requiresSmallestWidthDp="600" />
...
</manifest>
不缩放
res/drawable-nodpi/icon.png

该方法基于Android多屏幕适配-手机思想


【dp转换】

要修复此问题,手势阈值必须在代码中以 dp 表示,然后 转换为实际像素。例如:

// The gesture threshold expressed in dp
private static final float GESTURE_THRESHOLD_DP = 16.0f;

// Get the screen's density scale
final float scale = getResources().getDisplayMetrics().density;
// Convert the dps to pixels, based on density scale
mGestureThreshold = (int) (GESTURE_THRESHOLD_DP * scale + 0.5f);

// Use mGestureThreshold as a distance in pixels...
DisplayMetrics.density 字段根据当前屏幕密度指定 将 dp 单位转换为像素必须使用的缩放系数。 在中密度屏幕上,DisplayMetrics.density 等于 1.0;在高密度屏幕上,它等于 1.5;在超高密度屏幕上,等于 2.0; 在低密度屏幕上,等于 0.75。此数字是一个系数,应用其乘以 dp 单位以获取用于当前屏幕的实际像素数。(然后在转换时加上 0.5f,将该数字四舍五入到最接近的整数。)如需了解 详细信息,请参阅 DisplayMetrics 类。






ui基准是1024x552mdpi。则屏幕宽度值的基准设置为sw552dp或sw600dp.

对于不同的屏幕密度的设置如下:

1024x552mdpi=sw552dp或者sw600dp或者sw600dp-1024x552

1024x552hdpi=sw828dp或者sw828dp-1024x552

以此类推,保证sw限定符的单位是dp即可。

以1024x552mdpi基准举例,适配1200x400hdpi,资源应该是sw600dp-1200x400

注意:屏幕1024x552mdpi和1200x400hdpi,都可以使用同一个sw600dp资源。


注意:最好要在values下的dimens设置默认值。


参考资料:

Google官方文档

https://developer.android.com/guide/practices/screens_support.html
开源,原创,实用Android 屏幕适配方案分享

https://blog.csdn.net/u011200604/article/details/52786880






低密度 (120),ldpi 中密度 (160),mdpi 高密度 (240),hdpi 超高密度 (320),xhdpi
小屏幕 QVGA (240x320) 480x640
正常屏幕 WQVGA400 (240x400)
WQVGA432 (240x432) HVGA (320x480) 【WVGA800 (480x800) WVGA854 (480x854) 600x1024】 640x960
大屏幕 WVGA800** (480x800)
WVGA854** (480x854) WVGA800* (480x800)
WVGA854* (480x854)
600x1024
超大屏幕 1024x600 WXGA (1280x800)?
1024x768
1280x768 1536x1152
1920x1152
1920x1200 2048x1536

2560x1536
2560x1600





从命令行启动 AVD 时,可以使用 -scale 选项指定用于 模拟器的缩放比例。例如:

emulator -avd <avd_name> -scale 96dpi



















小屏幕,纵向:单窗格,带徽标
小屏幕,横向:单窗格,带徽标
7 英寸平板电脑,纵向:单窗格,带操作栏
7 英寸平板电脑,横向:双窗格,宽,带操作栏
10 英寸平板电脑,纵向:双窗格,窄,带操作栏
10 英寸平板电脑,横向:双窗格,宽,带操作栏
TV,横向:双窗格,宽,带操作栏
因此,以上每一种布局都在 res/layout/ 目录下的某个 XML 文件中定义。如果之后需要将每一种布局分配给各种屏幕配置,应用会使用布局别名将它们与每一种配置进行匹配:

res/layout/onepane.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<fragment android:id="@+id/headlines"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.HeadlinesFragment"
android:layout_width="match_parent" />
</LinearLayout>
res/layout/onepane_with_bar.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout android:layout_width="match_parent"
android:id="@+id/linearLayout1"
android:gravity="center"
android:layout_height="50dp">
<ImageView android:id="@+id/imageView1"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/logo"
android:paddingRight="30dp"
android:layout_gravity="left"
android:layout_weight="0" />
<View android:layout_height="wrap_content"
android:id="@+id/view1"
android:layout_width="wrap_content"
android:layout_weight="1" />
<Button android:id="@+id/categorybutton"
android:background="@drawable/button_bg"
android:layout_height="match_parent"
android:layout_weight="0"
android:layout_width="120dp"
style="@style/CategoryButtonStyle"/>
</LinearLayout>

<fragment android:id="@+id/headlines"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.HeadlinesFragment"
android:layout_width="match_parent" />
</LinearLayout>
res/layout/twopanes.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<fragment android:id="@+id/headlines"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.HeadlinesFragment"
android:layout_width="400dp"
android:layout_marginRight="10dp"/>
<fragment android:id="@+id/article"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.ArticleFragment"
android:layout_width="fill_parent" />
</LinearLayout>
res/layout/twopanes_narrow.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<fragment android:id="@+id/headlines"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.HeadlinesFragment"
android:layout_width="200dp"
android:layout_marginRight="10dp"/>
<fragment android:id="@+id/article"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.ArticleFragment"
android:layout_width="fill_parent" />
</LinearLayout>
至此所有可能的布局均已定义,现在只需使用配置限定符将正确的布局映射到每一种配置。 现在您可以使用布局别名技巧来完成这项工作:

res/values/layouts.xml:

<resources>
<item name="main_layout" type="layout">@layout/onepane_with_bar</item>
<bool name="has_two_panes">false</bool>
</resources>
res/values-sw600dp-land/layouts.xml:

<resources>
<item name="main_layout" type="layout">@layout/twopanes</item>
<bool name="has_two_panes">true</bool>
</resources>
res/values-sw600dp-port/layouts.xml:

<resources>
<item name="main_layout" type="layout">@layout/onepane</item>
<bool name="has_two_panes">false</bool>
</resources>
res/values-large-land/layouts.xml:

<resources>
<item name="main_layout" type="layout">@layout/twopanes</item>
<bool name="has_two_panes">true</bool>
</resources>
res/values-large-port/layouts.xml:

<resources>
<item name="main_layout" type="layout">@layout/twopanes_narrow</item>
<bool name="has_two_panes">true</bool>
</resources>
使用九宫格位图