Android 屏幕适配的最优方案(一)(2)

| 超超高密度(xxhdpi) | 1080x1920 | 480 |

(4)屏幕尺寸、分辨率、像素密度三者关系


一部手机的分辨率是宽x高,屏幕大小是以寸为单位,那么三者的关系是:

关系

3.密度无关像素

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

density-independent pixel,叫dp或dip,与终端上的实际物理像素点无关。可以保证在不同屏幕像素密度的设备上显示相同的效果。

1.Android开发时用dp而不是px单位设置图片大小,是Android特有的单位

2.场景:假如同样都是画一条长度是屏幕一半的线,如果使用px作为计量单位,那么在480x800分辨率手机上设置应为240px;在320x480的手机上应设置为160px,二者设置就不同了;如果使用dp为单位,在这两种分辨率下,160dp都显示为屏幕一半的长度。

(1)dp与px的转换


px = dp * (dpi / 160)

| 密度类型 | 代表的分辨率(px) | 屏幕密度(dpi) | 换算(px/dp) | 比例 |

| — | :-: | --: | --: | --: |

| 低密度(ldpi) | 240x320 | 120 | 1dp=0.75px | 3 |

| 中密度(mdpi) | 320x480 | 160 | 1dp=1px | 4 |

| 高密度(hdpi) | 480x800 | 240 | 1dp=1.5px | 6 |

| 超高密度(xhdpi) | 720x1280 | 320 | 1dp=2px | 8 |

| 超超高密度(xxhdpi) | 1080x1920 | 480 | 1dp=3px | 12 |

在Android中,规定以160dpi(即屏幕分辨率为320x480)为基准:1dp=1px

(2)独立比例像素


sp,即scale-independent pixels,与dp类似,但是可以根据文字大小首选项进行放缩,是设置字体大小的御用单位。

4.解决方案

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

(1)使用备用布局 -使用限定符


  • 尺寸(size)限定符

  • 使用最小宽(Smallest-width)度限定符

  • 布局别名

  • 屏幕方向(Orientation)限定符

(2)使用最小宽度限定符


使用“最小宽度”屏幕尺寸限定符,您可以为具有最小宽度(以dp 或 dip 为度量单位)的屏幕提供备用布局。

通过将屏幕尺寸描述为密度无关像素的度量值,Android 允许您创建专为非常具体的屏幕尺寸而设计的布局,同时让您不必对不同的像素密度有任何担心。

例如,您可以创建一个名为 main_activity 且针对手机和平板电脑进行了优化的布局,方法是在目录中创建该文件的不同版本,如下所示:

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)

最小宽度限定符指定屏幕两侧的最小尺寸,而不考虑设备当前的屏幕方向,因此这是一种指定布局可用的整体屏幕尺寸的简单方法。

下面是其他最小宽度值与典型屏幕尺寸的对应关系:

  • 320dp:典型手机屏幕(240x320 ldpi、320x480 mdpi、480x800 hdpi 等)。

  • 480dp:约为 5 英寸的大手机屏幕 (480x800 mdpi)。

  • 600dp:7 英寸平板电脑 (600x1024 mdpi)。

  • 720dp:10 英寸平板电脑(720x1280 mdpi、800x1280 mdpi 等)。

下图提供了一个更详细的视图,说明了不同屏幕 dp 宽度与不同屏幕尺寸和方向的一般对应关系。

对应关系上图建议的宽度断点以支持不同的屏幕尺寸。

请记住,最小宽度限定符的所有数值都是密度无关像素,因为重要的是系统考虑像素密度(而不是原始像素分辨率)之后可用的屏幕空间量。

**注意:**您使用这些限定符指定的尺寸不是实际屏幕尺寸,而是 Activity 窗口可用的宽度或高度(以 dp为单位)。Android 系统可能会将部分屏幕用于系统界面(如屏幕底部的系统栏或顶部的状态栏),因此部分屏幕可能不可供您的布局使用。如果您的应用在多窗口模式下使用,则它只能使用该窗口的尺寸。对该窗口进行大小调整时,它会使用新窗口尺寸触发配置更改,以便系统可以选择适当的布局文件。因此,在声明尺寸时,您应具体说明 Activity 需要的尺寸。在声明为布局提供的空间时,系统会考虑系统界面使用的所有空间。

(3)使用可用宽度限定符


您可能希望根据当前可用的宽度或高度来更改布局,而不是根据屏幕的最小宽度来更改布局。例如,如

果您有一个双窗格布局,您可能希望在屏幕宽度至少为 600dp 时使用该布局,但屏幕宽度可能会根据设备的屏幕方向是横向还是纵向而发生变化。在这种情况下,您应使用“可用宽度”限定符,如下所示:

res/layout/main_activity.xml # For handsets (smaller than 600dp available width)

res/layout-w600dp/main_activity.xml # For 7” tablets or any screen with 600dp # available width (possibly landscape handsets)

如果您关心可用高度,则可以使用“可用高度”限定符来执行相同的操作。例如,对于屏幕高度至少为600dp 的屏幕,请使用限定符 layout-h600dp 。

(4)添加屏幕方向限定符


虽然您可能只需将“最小宽度”和“可用宽度”限定符结合使用即可支持所有尺寸变化,但是您可能还希望当用户在纵向与横向之间切换屏幕方向时改变用户体验。

为此,您可以将 port 或 land 限定符添加到资源目录名称中。只需确保这些限定符在其他尺寸限定符后面即可。例如:

res/layout/main_activity.xml # For handsets

res/layout-land/main_activity.xml # For handsets in landscape

res/layout-sw600dp/main_activity.xml # For 7” tablets

res/layout-sw600dp-land/main_activity.xml # For 7” tablets in landscape

(5)使用 Fragment 将界面组件模块化


在针对多种屏幕尺寸设计应用时,您希望确保不会在 Activity 之间不必要地重复界面行为。因此,您应该使用 Fragment 将界面逻辑提取到单独的组件中。然后,您可以组合 Fragment 以便在大屏幕设备上运行时创建多窗格布局,或者在手机上运行时将 Fragment 放置在单独的 Activity 中。

例如,平板电脑上的一款新闻应用可能在左侧显示报道列表,而在右侧显示一篇完整的报道。在左侧选择一篇报道时,会更新右侧的报道视图。但是,在手机上,这两个组件应显示在单独的屏幕上。从列表中选择一篇报道时,会改变整个屏幕以显示这篇报道。

例如,平板电脑上的一款新闻应用可能在左侧显示报道列表,而在右侧显示一篇完整的报道。在左侧选择一篇报道时,会更新右侧的报道视图。但是,在手机上,这两个组件应显示在单独的屏幕上。从列表中选择一篇报道时,会改变整个屏幕以显示这篇报道。

(6)使用旧尺寸限定符支持 Android 3.1


如果您的应用支持 Android 3.1(API 级别 12)或更低版本,则除上面的最小/可用宽度限定符之外,您还需要使用旧尺寸限定符。

在上面的示例中,如果要在较大的设备上显示双窗格布局,那么您需要使用“large”配置限定符来支持3.1 及更低版本。因此,要在这些旧版本上实现此类布局,您可能需要创建以下文件:

res/layout/main_activity.xml # For handsets (smaller than 640dp x 480dp)

res/layout-large/main_activity.xml # For small tablets (640dp x 480dp and bigger)

res/layout-xlarge/main_activity.xml # For large tablets (960dp x 720dp and bigger)

(7)使用布局别名


如果同时支持低于和高于 Android 3.2 的版本,您必须同时对布局使用最小宽度限定符和“large”限定符。因此,您应创建一个名为 res/layout-large/main.xml 的文件,该文件可能与 res/layout- sw600dp/main.xml 完全相同。

为避免同一文件出现这种重复,您可以使用别名文件。例如,您可以定义以下布局:

res/layout/main.xml # single-pane layout

res/layout/main_twopanes.xml # two-pane layout

并添加以下两个文件:

  • res/values-large/layout.xml

最后送福利了,现在关注我可以获取包含源码解析,自定义View,动画实现,架构分享等。
内容难度适中,篇幅精炼,每天只需花上十几分钟阅读即可。
大家可以跟我一起探讨,有flutter—底层开发—性能优化—移动架构—资深UI工程师 —NDK相关专业人员和视频教学资料,还有更多面试题等你来拿

录播视频图.png

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

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

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

…(img-hOd5UuIA-1714314525144)]

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值