欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android屏幕适配笔记

程序员文章站 2022-08-06 20:51:18
最近做项目遇到了屏幕适配的问题,当然如果只是面向主流开发,也不太需要做适配了,但是适配一下总是比较好的。也查了很多文章,这里做下笔记吧。详细分析看一下我贴的原文章链接。屏幕适配名词解释参考文章px (pixel): Android中代表绝对像素,比如 160px 的控件在分辨率为宽 320px 的设备中占一半,在分辨率为宽 640px 的设备中占 1/4。所以这在开发中肯定不被推荐使用。dpi (dots per inch): 为了避免使用 px 带来的问题,dpi 翻译过来就是每一英寸的屏幕所...

最近做项目遇到了屏幕适配的问题,当然如果只是面向主流开发,也不太需要做适配了,但是适配一下总是比较好的。
也查了很多文章,这里做下笔记吧。详细分析看一下我贴的原文章链接。

屏幕适配

名词解释

参考文章

px (pixel): Android中代表绝对像素,比如 160px 的控件在分辨率为宽 320px 的设备中占一半,在分辨率为宽 640px 的设备中占 1/4。所以这在开发中肯定不被推荐使用。

dpi (dots per inch): 为了避免使用 px 带来的问题,dpi 翻译过来就是每一英寸的屏幕所包含的像素数。

举例来说,假设现在有一台“宽2英寸,长3英寸”的设备,则:

  • 当该设备分辨率为“320*480”,则dpi值为160。
  • 当该设备分辨率为“640*960”,则dpi值为320。

正是因为dpi值其代表的特性,所以android项目的资源文件下存在以下目录:

  • drawable-ldpi ( 当dpi为120时,使用此目录下的资源)
  • drawable-mdpi ( 当dpi为160时,使用此目录下的资源)
  • drawable-hdpi ( 当dpi为240时,使用此目录下的资源)
  • drawable-xhdpi ( 当dpi为320时,使用此目录下的资源)
  • drawable-xxhdpi ( 当dpi为480时,使用此目录下的资源)

Android正是根据设备DPI值得不同,选择清晰度不同的资源使用,完成屏幕的适配。

DP/DIP (device independent pixels): Android引入的 dp 是设备独立像素,在Android当中规定:在屏幕密度为“160dpi”的情况下,则刚好“1dp = 1px”,当屏幕密度为“320dpi”时,则“1dp = 2px”,以此类推。

让我们回到上面说到的使用px造成的控件显示问题,此时我们将使用新的单位“dp”。于是:

  • 在分辨率320*480(既dpi为160)的设备下,则160dp等价于160px,按钮占屏幕宽的一半。
  • 在分辨率640*960(既dpi为320)的设备下,则160dp等价于320px,按钮依然占屏幕宽的一半。

**Density:**就这个单词本身直接翻译的意思而言,其也代表“密度”。但需要注意的是,在Android中,其实并非如此。

注意我们这里指的是,通过代码“context.getResources().getDisplayMetrics().density”获取的“density”值。

而通过该方法获取到的该值,实际上是等价于“dpi / 160”的一个结果值。也就是说:

“getResources().getDisplayMetrics().density” = “getResources().getDisplayMetrics().densityDpi / 160”

借鉴今日头条适配方案

参考文章

今日头条适配原理:density =(当前屏幕分辨率宽或高(单位px))/(ui设计稿宽或高(单位dp)),这个表示的是1dp在当前分辨率下的所对于的像素

真正的view大小: realWidth = (ui设计稿上的宽度)*density

今日头条适配方案默认项目中只能以高或宽中的一个作为基准,进行适配,因为目前大部分市面上的 Android 设备的屏幕高宽比都不一致,这时我们只以高或宽其中的一个作为基准进行适配,就会有效的避免布局在高宽比不一致的屏幕上出现变形的问题。

density 在每个设备上都是固定的,DPI / 160 = density屏幕的总 px 宽度 / density = 屏幕的总 dp 宽度

  • 设备 1,屏幕宽度为 1080px480DPI,屏幕总 dp宽度为 1080 / (480 / 160) = 360dp
  • 设备 2,屏幕宽度为 1440px560DPI,屏幕总 dp宽度为 1440 / (560 / 160) = 411dp

可以看到屏幕的总 dp 宽度在不同的设备上是会变化的,但是我们在布局中填写的 dp 值却是固定不变的

这时我们要想完美适配,那就必须保证这个 View 在任何分辨率的屏幕上,与屏幕的比例都是相同的

这时我们该怎么做呢?改变每个 Viewdp 值?不现实,在每个设备上都要通过代码动态计算 Viewdp 值,工作量太大

如果每个 Viewdp 值是固定不变的,那我们只要保证每个设备的屏幕总 dp 宽度不变,就能保证每个 View 在所有分辨率的屏幕上与屏幕的比例都保持不变,从而完成等比例适配,并且这个屏幕总 dp 宽度如果还能保证和设计图的宽度一致的话,那我们在布局时就可以直接按照设计图上的尺寸填写 dp 值。

当前设备屏幕总宽度(单位为像素)/ 设计图总宽度(单位为 dp) = density

这个公式就是把上面公式中的 屏幕的总 dp 宽度 换成 设计图总宽度,原理都是一样的,只要 density 根据不同的设备进行实时计算并作出改变,就能保证 设计图总宽度 不变,也就完成了适配

使用

GitHub地址

主流机型设备信息

本文地址:https://blog.csdn.net/sinat_41895958/article/details/107563890