android使用dp做屏幕适配会出现的问题

一直以来android屏幕尺寸相关的东西我都很薄弱,什么dpi, ppi, 英寸我都比较疑惑,本文主要是理清概念。以及为什么要做屏幕适配

一些基础概念

屏幕尺寸

屏幕尺寸指屏幕的对角线的长度,单位是英寸,1英寸=2.54厘米。这个值是利用手机屏幕的长和宽,然后利用勾股定理,就可以算出斜边的长了。即当你听到5英寸的屏幕时,你大概知道。这个手机大概是这么大: 手机对角线的长度为(2.54 * 5)12.5厘米。

屏幕像素密度与屏幕分辨率

屏幕像素密度,即每英寸屏幕所拥有的像素数,英文简称ppi(Pixels Per Inch)。

屏幕分辨率是指在横纵向上的像素点数,单位是px,1px=1个像素点

屏幕像素密度与屏幕尺寸和屏幕分辨率有关:

即在单一变化条件下,屏幕尺寸越小、分辨率越高则像素密度越大,反之越小。

dpi又是什么呢? 其实对Android而言,dpi等价于ppi。 具体解释可以参考这篇文章:

https://blog.csdn.net/u010134087/article/details/54926403

Android中的屏幕尺寸相关概念

dp

dp是一种密度无关像素,对应于160dpi下像素的物理尺寸。它与 1px 的关系是 : 1dp = 1px * (dpi / 160)。即dp会根据设备的dpi的不同而变化。

sp的概念与dp类似,是用来表示字体大小的一个单位。

官方定义在160dpi下,1dip=1px,如果320dpi,则1dip=2px,以此类推。这里延伸出我们常说的一个密度,其实这里就可以理解为: (dpi / 160)。
常见的密度:

dpi/160手机的dpi参数
xxhdpi3.0480dpi
xhdpi2.0320 dpi
hdpi1.5240dpi
mdpi1.0(基准)160 dpi
ldpi0.75120dpi

可能还是有点迷糊,我们来看一加5T手机的实际参数图:

所以 : 1dp = 2.51px 。 即在垂直方向上共有860dp,在水平方向上共有420dp。

  • 为什么要使用dp来做适配?

一般设计在出图的时候只会给一个设计图,假如设计图的尺寸是固定的。那么在编写UI界面时,很多UI的尺寸就是按照这个设计图的尺寸来编写的。

假如说你使用的单位是px。一个button设计标记的宽尺寸是1000像素(px)。那在一些宽度不足1000像素(px)的手机上,那个这个button根本就不能完全显示出来。

因此Android官方推荐我们以dp为单位编写UI设计的。这是因为dp在不同的设备(dpi)会转化为不同的像素值。但是使用dp来做屏幕适配还是会有一些问题的:

使用dp做屏幕适配会引发的问题

我们先假设有两个设备:

设备1,屏幕宽度为 1080px,480DPI,屏幕总 dp 宽度为 1080 / (480 / 160) = 360dp

设备2,屏幕宽度为 1600px,560DPI,屏幕总 dp 宽度为 1600 / (560 / 160) = 457dp

那么如果对于一个view,它的left margin我们都设置为100dp。 那么这个view在这两个设备上渲染时是什么情况呢? 我们来看一下实际的渲染图:

即在同样设置left marin为100dp的情况下,在设备一上会感觉这个left margin比设备二的left margin要大。

如何解决dp适配所引发的问题呢?

对于这个问题的解决业界已经有了几种比较成熟的方案,比如:

今日头条适配方案

SmallestWidth限定符适配方案

这两个方案会在下面的文章继续分析。我们先预先讨论一下这两个方案解决dp适配引发的问题的核心思想 :

解决的核心思想

首先我们定义一个概念 : density = dpi / 160, dp = px * (dpi / 160) 。 所以 1 dp = 1px * density

比如说我们的设计图纸宽是360dp。 那么对于宽为457dp的设备,我们希望100dp的尺寸在360dp的宽457dp的宽展示的是一样的效果,即占整个屏幕的百分比都是一样的。

即写100dp,在457dp的宽的设备上应表现为123dp。那这个要怎么做到呢?

上面提的两种方案分别通过不同的方法来实现了这个解决方式。

阅读全文
下载说明:
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.dandroid.cn/archives/20122,转载请注明出处。
0

评论0

显示验证码
没有账号?注册  忘记密码?