Android 屏幕适配方案,【干货】

本文详细介绍了Android设备屏幕适配的方法,包括使用相对布局、尺寸策略、限定符(如Size和最小宽度限定符)、布局别名以及图片和动画的自适应技巧。此外,还提到了如何通过代码进行设备宽度测量和设置,以实现最佳用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

备注 : 在生产过程中,厂家不会完全按照屏幕密度标准去生产Android设备,会在Google的标准周围浮动变化,或是偏离Google的屏幕密度标准比较大,再加上理论计算(开方)造成的误差,实际上使用dp作为单位是不能完完全全的完成适配操作;

  • 3.1.2 使用相对布局或线性布局,不要使用绝对布局
    对于线性布局(Linearlayout)、相对布局(RelativeLayout)、帧布局(FrameLayout)、绝对布局(AbsoluteLayout)以及新增的加强版帧布局(CoordinatorLayout)需要根据需求进行选择,没有绝对而言。
    但因为RelativeLayout讲究的是相对位置,即使屏幕的大小改变,视图之前的相对位置都不会变化,与屏幕大小无关,灵活性很强,而LinearLayout法准确地控制子视图之间的位置关系,只能简单的一个挨着一个地排列,所以,对于屏幕适配来说,使用相对布局(RelativeLayout)将会是更好的解决方案,至于绝对布局由于适配性极差,所以极少使用。

  • 3.1.3 使用wrap_content、match_parent、权重
    使用 “wrap_content” 和 “match_parent” 尺寸值而不是硬编码的尺寸,系统会自动计算相应的数值,视图就会相应地使用自身所需的空间或填满可用空间,让布局正确适应各种屏幕尺寸和屏幕方向,组件的权重比同理。

  • 3.1.4 使用minWidth、minHeight、lines等属性
    很多时候我们显示的数据都是由后台返回的,再由我们加工处理后去适配我们的组件,这些数据的长度我们是无法确定的,而正常情况下我们构思的布局都仅是适用于理想的情况下,为了保证界面的对齐、数据显示完整等等的原因,我们需要在构思布局时增加对组件最小宽高度、行数等属性的设置,确保在特殊的数据下不会破坏我们的整体布局。

  • 3.1.5 dimens使用
    组件的长宽我们可以通过dimens来定义,不同的屏幕尺寸可以定义不同的数值,或者是不同的语言显示我们也可以定义不同的数值,因为翻译后的长度一般都不会跟中文的一致。

3.2 关于布局的适配:

以上几种方式可以解决屏幕适配性的问题,但是那些通过伸缩控件来适应各种不同屏幕大小的布局,未必就是提供了最好的用户体验。你的应用程序应该不仅仅实现了可自适应的布局,还应该提供一些方案根据屏幕的配置来加载不同的布局,可以通过配置限定符(configuration qualifiers)来实现。配置限定符允许程序在运行时根据当前设备的配置自动加载合适的资源(比如为不同尺寸屏幕设计不同的布局)。

  • 3.2.1 使用Size限定符
    很多应用会在较大的屏幕上实施“双面板”模式,即在一个面板上显示项目列表,而在另一面板上显示对应内容。平板电脑和电视的屏幕已经大到可以同时容纳这两个面板了,但手机屏幕就需要分别显示。因此,我们可以使用以下文件以便实施这些布局:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1446102583971944.jpg

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1446102728277991.jpg

请注意第二种布局名称目录中的 large 限定符。系统会在属于较大屏幕(例如 7 英寸或更大的平板电脑)的设备上选择此布局。系统会在较小的屏幕上选择其他布局(无限定符)。

  • 3.2.2 最小宽度限定符
    使用Size限定符有一个问题会让很多程序员感到头疼,large到底是指多大呢?很多应用程序都希望能够更自由地为不同屏幕设备加载不同的布局,不管它们是不是被系统认定为”large”。这就是Android为什么在3.2以后引入了”Smallest-width”限定符。
    最小宽度限定符可让您通过指定某个最小宽度(以 dp 为单位)来定位屏幕。例如,标准 7 英寸平板电脑的最小宽度为 600 dp,因此如果您要在此类屏幕上的用户界面中使用双面板(但在较小的屏幕上只显示列表),您可以使用上文中所述的单面板和双面板这两种布局,但您应使用 sw600dp 指明双面板布局仅适用于最小宽度为 600 dp 的屏幕,而不是使用 large 尺寸限定符。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1446102760481409.jpg

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1446102807853454.jpg

也就是说,对于最小宽度大于等于 600 dp 的设备,系统会选择 layout-sw600dp/main.xml(双面板)布局,否则系统就会选择 layout/main.xml(单面板)布局。

但 Android 版本低于 3.2 的设备不支持此技术,原因是这些设备无法将 sw600dp 识别为尺寸限定符,因此我们仍需使用 large 限定符。这样一来,就会有一个名称为 res/layout-large/main.xml 的文件(与 res/layout-sw600dp/main.xml 一样)。但是没有太大关系,我们将马上学习如何避免此类布局文件出现的重复。

  • 3.2.3 使用布局别名
    最小宽度限定符仅适用于 Android 3.2 及更高版本。因此,如果我们仍需使用与较低版本兼容的概括尺寸范围(小、正常、大和特大)。例如,如果要将用户界面设计成在手机上显示单面板,但在 7 英寸平板电脑、电视和其他较大的设备上显示多面板,那么我们就需要提供以下文件:

res/layout/main.xml: 单面板布局 res/layout-large: 多面板布局 res/layout-sw600dp: 多面板布局

后两个文件是相同的,因为其中一个用于和 Android 3.2 设备匹配,而另一个则是为使用较低版本 Android 的平板电脑和电视准备的。

要避免平板电脑和电视的文件出现重复(以及由此带来的维护问题),您可以使用别名文件。例如,您可以定义以下布局:

  • res/layout/main.xml,单面板布局

  • res/layout/main_twopanes.xml,双面板布局

然后添加这两个文件:

res/values-large/layout.xml:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1446102885594589.jpg

res/values-sw600dp/layout.xml:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1446102894526452.jpg

后两个文件的内容相同,但它们并未实际定义布局。它们只是将 main 设置成了 main_twopanes 的别名。由于这些文件包含 large 和 sw600dp 选择器,因此无论 Android 版本如何,系统都会将这些文件应用到平板电脑和电视上(版本低于 3.2 的平板电脑和电视会匹配 large,版本高于 3.2 的平板电脑和电视则会匹配 sw600dp)。

  • 3.2.4 使用屏幕方向限定符
    某些布局会同时支持横向模式和纵向模式,但我们可以通过调整优化其中大部分布局的效果。在新闻阅读器示例应用中,每种屏幕尺寸和屏幕方向下的布局行为方式如下所示:

小屏幕,纵向:单面板,带徽标
小屏幕,横向:单面板,带徽标
7 英寸平板电脑,纵向:单面板,带操作栏
7 英寸平板电脑,横向:双面板,宽,带操作栏
10 英寸平板电脑,纵向:双面板,窄,带操作栏
10 英寸平板电脑,横向:双面板,宽,带操作栏
电视,横向:双面板,宽,带操作栏

因此,这些布局中的每一种都定义在了 res/layout/ 目录下的某个 XML 文件中。为了继续将每个布局分配给各种屏幕配置,该应用会使用布局别名将两者相匹配:

res/layout/onepane.xml:(单面板)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1446102945879746.jpg

res/layout/onepane_with_bar.xml:(单面板带操作栏)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1446102982969502.jpg

res/layout/twopanes.xml:(双面板,宽布局)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1446103034115365.jpg

res/layout/twopanes_narrow.xml:(双面板,窄布局)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1446103047709192.jpg

既然我们已定义了所有可能的布局,那就只需使用配置限定符将正确的布局映射到各种配置即可。

现在只需使用布局别名技术即可做到这一点:

res/values/layouts.xml:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1446103188926681.jpg

res/values-sw600dp-land/layouts.xml:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1446103198972935.jpg

res/values-sw600dp-port/layouts.xml:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1446103206749499.jpg

res/values-large-land/layouts.xml:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1446103214277258.jpg

res/values-large-port/layouts.xml:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1446103221453853.jpg

  • 3.2.5 多套layout适配
    res/values/layouts.xml: res/values-sw600dp-land/layouts.xml: res/values-sw600dp-port/layouts.xml: res/values-large-land/layouts.xml: res/values-large-port/layouts.xml:
3.3 关于图片的适配:
  • 3.3.1 LOGO 图标
    建议按官方标准准备好各个图标;
屏幕密度对应的图片大小图片资源目录
120dip36px * 36pxmipmap-ldpi
160dip(基准)48px * 48pxmipmap或者mipmap-mdpi
240dip(1.5倍)72px * 72pxmipmap-hdpi
320dip (2倍)96px * 96pxmipmap-xhdpi
480dip (3倍)144px * 144pxmipmap-xxhdpi
640dip (4倍)192px * 192pxmipmap-xxxhdpi
  • 3.3.2 普通图片和图标
    建议安装官方的密度类型进行切图即可,但一般我们只需xxhdpi或xxxhdpi的切图即可满足我们的需求;

  • 3.3.3 自动拉伸位图:Nine-Patch的图片类型
    支持不同屏幕大小通常情况下也意味着,你的图片资源也需要有自适应的能力。例如,一个按钮的背景图片必须能够随着按钮大小的改变而改变。 如果你想使用普通的图片来实现上述功能,你会发现这是难以实现的,因为运行时会均匀地拉伸或压缩你的图片。解决方案是使用nine-patch图片,它是一种被特殊处理过的PNG图片,你可以指定哪些区域可以拉伸而哪些区域不可以。

  • 3.3.4 动画、自定义view、shape
    可以使用代码进行控制和展示多种视图,如patch动画替代帧动画。

  • 3.3.5 ImageView的ScaleType适配

  1. android:scaleType=“center” 保持原图的大小,显示在ImageView的中心。当原图的size大于ImageView的size时,多出来的部分被截掉。
  2. android:scaleType=“center_inside” 以原图正常显示为目的,如果原图大小大于ImageView的size,就按照比例缩小原图的宽高,居中显示在ImageView中。如果原图size小于ImageView的size,则不做处理居中显示图片。
  3. android:scaleType=“center_crop” 以原图填满ImageView为目的,如果原图size大于ImageView的size,则与center_inside一样,按比例缩小,居中显示在ImageView上。如果原图size小于ImageView的size,则按比例拉升原图的宽和高,填充ImageView居中显示。
  4. android:scaleType=“matrix” 不改变原图的大小,从ImageView的左上角开始绘制,超出部分做剪切处理。
  5. androd:scaleType=“fit_xy” 把图片按照指定的大小在ImageView中显示,拉伸显示图片,不保持原比例,填满ImageView.
  6. android:scaleType=“fit_start” 把原图按照比例放大缩小到ImageView的高度,显示在ImageView的start(前部/上部)。
  7. android:sacleType=“fit_center” 把原图按照比例放大缩小到ImageView的高度,显示在ImageView的center(中部/居中显示)。
  8. android:scaleType=“fit_end” 把原图按照比例放大缩小到ImageView的高度,显示在ImageVIew的end(后部/尾部/底部)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.4 关于代码适配:

在代码中使用Google提供的API对设备的屏幕宽度进行测量,然后按照需求进行设置。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

学习分享,共勉

Android高级架构师进阶之路

题外话,我在阿里工作多年,深知技术改革和创新的方向,Android开发以其美观、快速、高效、开放等优势迅速俘获人心,但很多Android兴趣爱好者所需的进阶学习资料确实不太系统,完整。今天我把我搜集和整理的这份学习资料分享给有需要的人,若有关Android学习进阶可以与我在Android终极开发交流群一起讨论交流。 点击这里前往我的Git领取资料 的同时,还可以加入一个好的学习交流圈,何乐而不为呢?加入我们和我们一起吧!!

  • Android进阶知识体系学习脑图

  • Android进阶高级工程师学习全套手册

  • 对标Android阿里P7,年薪50w+学习视频

  • 大厂内部Android高频面试题,以及面试经历

**

[外链图片转存中…(img-rWnMF3R2-1711296383061)]

  • Android进阶高级工程师学习全套手册

[外链图片转存中…(img-v8GRXfH4-1711296383061)]

  • 对标Android阿里P7,年薪50w+学习视频

[外链图片转存中…(img-SsQgOhDA-1711296383061)]

  • 大厂内部Android高频面试题,以及面试经历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值