分享一点关于Android屏幕适配的种种(1)

2. 分辨率

比如: 19201080 分辨率,表示当前设备的屏幕是由 横向1080 纵向1920 个像素点 组合而成。

3. 屏幕尺寸

屏幕对角线的长度。一般以英寸为单位,常见的屏幕尺寸有 4.7 , 5.5 , 6.0 。

4. 屏幕像素密度

定义: 一平方英寸面积内,存在 多少个像素点。同样是 1920*1080 的分辨率,存在两款手机,一个是4.7英寸,一个是6.0英寸,这两者的 像素密度是不一样的。屏幕密度的单位: dpi(dots per inch).标准屏幕分辨率 :160dpi 。即:一平方英寸面积,存在 160像素点。(mdpi).

5. 屏幕尺寸,分辨率,像素密度 三者之间的关系

像素密度,可以由 屏幕尺寸和 分辨率计算得出。计算公式为:

比如下图所示:

我这里有一块1920*1080的5寸屏幕,通过上面的公式计算得出,它的像素密度为 440dpi . 可见,px是和像素密度有直接关系的 像素单位。

6. 密度无关的像素单位(dp,或者dip)

全英文为: density-independent pixel.(注意此处是 dip,上面的像素密度是 dpi, 千万不要因为这个,在面试的时候出丑 )使用dp作为长度单位,可以保证在不同的屏幕像素密度的手机上显示 很相似的效果。比如: 使用 480x800的手机上,要画一条长度为一半屏幕宽的线条,我们可以设置线条的长度为 240px,而在 320x480的屏幕上,我们只需要 160px,但是我们可以直接使用 160dp,来同时让两个屏幕上的这条线占全宽的一半。

px和dp的换算公式为: px=dp*(dpi/160)公式解读:如果有一个屏幕密度为 160dpi的手机,在它上面,1px=1dp;而如果是 320dpi的手机,则 1px = 0.5dp. 简而言之规律就是:屏幕像素密度(dpi)越高的手机,1dp所代表的px就越多.

下面解释为什么dp有时候靠不住.

如果UI小姐姐以 320*480 dpi160的屏幕为标准,画了一条长度为 160px的线,长度为屏幕宽度的 一半,这个时候,你直接用 160dp,一般就能完成适配。但是如果这样的布局 运行在 320x480分辨率,但是屏幕密度为 150dpi 略小于 160dpi,这个时候 你布局里面写的 160dp就会实际超过 160px 不再是占屏幕宽的一半,而是略微超过。

7. 独立比例像素 (sp)

全英文为: scale-independent pixel (简称sp或者sip)专门用于字体大小表示。推荐使用 12sp以上的偶数作为 字体大小, 不要使用奇数,或者浮点型小数,因为容易造成精度丢失。

面试点:
Q: sp和dp有什么区别?
A: 通常情况下,dp和sp效果类似,但是有一点,如果用户 调整了手机字体,比如 从标准,变成了 超大,那么,1dp 原本等于1px依然不变,但是1sp就会从1px变成3px(只是举个例子,数值不必认真). 因此,在用户调整字体的情况下,同样的布局,可能出现 窗口大小不变,但是文字尺寸发生变化的情况。

屏幕适配攻略
1. 布局适配

使用多套布局适应不同屏幕。此方法必须要了解 布局限定符的概念。如图:

**限定符: ** 在原本的 layout后面加上横杠,然后加上限定名。形成 layout-XXX的形式,具体规则请参考谷歌官网: https://developer.android.google.cn/training/multiscreen/screensizes, 重点摘录如下:


使用上面的限定符,几乎可以解决所有的适配问题,但是另外还有一个小技巧帮我们节省工作量 : 布局别名.

**适用情形为:**当多个加了限定符的 layout.xml中都引用了同一个 子布局,而子布局的内容可能相同,也可能不同。这个时候,使用布局别名,可以节省操作量。


方案评价: 讲道理,这个是 下下策,因为在你需要修改布局的时候,你可能需要修改多套布局,这个要多恶心就多恶心,懂的人都懂.

2. 代码适配

我们通过java代码去获取屏幕的宽高,动态去指定控件的宽高 。获取屏幕宽高的方式

代码适配,一般用于动态创建 控件,或者自定义view自己绘制图形的时候。特别提一下接口适配:当你去向后台请求图片的时候,我们可以在参数中带入屏幕的宽高,或者是控件的宽高,来获取我们想要的图片,在图片返回之后直接就能显示得最优,而不需要我们app代码中多动手脚。

方案评价: 这个比下下策稍微好一点,但是 控件大小直接进入了代码,还是让代码不够雅观.

3. 布局组件的适配

尽量直接通过一套布局解决所有的麻烦,这个就叫布局组件的适配。这个是上上策. 包含如下手段:

  • 使用像素密度无关的单位 dp sp
  • 杜绝使用绝对布局,多使用相对和线性布局
  • 多使用 wrapcontent matchparent 以及线性布局的权重
  • 多用 minWidth minHeight,lines 等属性
  • 使用多套限定的 dimens中定义的尺寸

可能面试点

Q:同一个布局文件中,我使用线性布局和相对布局都可以达成目的,那么如何抉择?
A: 使用相对布局,很有可能出现 第一次测量"不满意"的情况,从而会测量第二次。如果两者都可以达成目的,并且两者的布局层级相同,并且线性布局中没有使用到 权重( 权重可能也会触发第二次测量),此时,优先使用线性布局。 除此之外,都选择相对布局。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

我见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了7、8年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。

其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 15
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值