写点什么

Android 屏幕适配的最优方案(一),安卓驱动面试

作者:嘟嘟侠客
  • 2021 年 11 月 27 日
  • 本文字数:3793 字

    阅读完需:约 12 分钟


《Android 学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享


lank#2_25)





1.为什么要屏幕适配


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


由于 Android 系统的开放性,任何用户、开发者、OEM 厂商、运营商都可以对 Android 进行定制,于是导致运行 Android 的设备多种多样,它们有着不同的屏幕尺寸和像素密度。 尽管系统可通过基本的缩放和调整大小功能使界面适应不同屏幕,但您应做出进一步优化,以确保界面能够在各类屏幕上美观地呈现。



2.首先我们要搞清楚,几个比较重要的概念。


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


(1)屏幕尺寸




屏幕尺寸指屏幕的对角线的长度,单位是英寸,1 英寸=2.54 厘米


比如常见的屏幕尺寸有 2.4、2.8、3.5、3.7、4.2、5.0、5.5、6.0 等


(2)屏幕分辨率




屏幕分辨率是指在横纵向上的像素点数,单位是 px,1px=1 个像素点。一般以纵向像素*横向像素,如 1960*1080。表示宽度方向上有 1080 个像素点,在高度方向上有 1920 个像素点


1.单位:px(pixel),1px=1 像素点


2.Android 手机常见的分辨率:320x480、480x800、720x1280、1080x1920


3.UI 设计师的设计图会以 px 作为统一的计量单位


(3)屏幕的像素密度




屏幕像素密度是指每英寸上的像素点数,单位是 dpi,即“dot per inch”的缩写。屏幕像素密度与屏幕尺寸和屏幕分辨率有关,在单一变化条件下,屏幕尺寸越小、分辨率越高,像素密度越大,反之越小。


假设设备内每英寸有 160 个像素,那么该设备的屏幕像素密度=160dpi。安卓手机对于每类手机屏幕大小都有一个相应的屏幕像素密度。


| 密度类型 | 代表的分辨率(px) | 屏幕像素密度(dpi) |


| --- | :-: | --: |


| 低密度(ldpi) | 240x320 | 120 |


| 中密度(mdpi) | 320x480 | 160 |


| 高密度(hdpi) | 480x800 | 240 |


| 超高密度(xhdpi) | 720x1280 | 320 |


| 超超高密度(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

文末

初级工程师拿到需求会直接开始做,然后做着做着发现有问题了,要么技术实现不了,要么逻辑有问题。


而高级工程师拿到需求会考虑很多,技术的可行性?对现有业务有没有帮助?对现有技术架构的影响?扩展性如何?等等...之后才会再进行设计编码阶段。


而现在随着跨平台开发,混合式开发,前端开发之类的热门,Android 开发者需要学习和掌握的技术也在不断的增加。


通过和一些行业里的朋友交流讨论,以及参考现在大厂面试的要求。我们花了差不多一个月时间整理出了这份 Android 高级工程师需要掌握的所有知识体系。你可以看下掌握了多少。


混合式开发,微信小程序。都是得学会并且熟练的



这些是 Android 相关技术的内核,还有 Java 进阶



高级进阶必备的一些技术。像移动开发架构项目实战等



Android 前沿技术;包括了组件化,热升级和热修复,以及各种架构跟框架的详细技术体系



以上即是我们整理的 Android 高级工程师需要掌握的技术体系了。可能很多朋友觉得很多技术自己都会了,只是一些新的技术不清楚而已。应该没什么太大的问题。


而这恰恰是问题所在!为什么别人高级工程师能年限突破 30 万,而你只有十几万呢?


就因为你只需补充你自己认为需要的,但并不知道企业需要的。这个就特别容易造成差距。因为你的技术体系并不系统,是零碎的,散乱的。那么你凭什么突破 30 万年薪呢?


我这些话比较直接,可能会戳到一些人的玻璃心,但是我知道肯定会对一些人起到点醒的效果的。而但凡只要有人因为我的这份高级系统大纲以及这些话找到了方向,并且付出行动去提升自我,为了成功变得更加努力。那么我做的这些就都有了意义。

喜欢的话请帮忙转发点赞一下能让更多有需要的人看到吧。谢谢!

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

用户头像

嘟嘟侠客

关注

还未添加个人签名 2021.03.19 加入

还未添加个人简介

评论

发布
暂无评论
Android 屏幕适配的最优方案(一),安卓驱动面试