基本概念

说到用命名含sw的文件夹做屏幕适配之前先说以下几个基本概念:

屏幕尺寸

屏幕尺寸指屏幕的对角线的长度,单位是英寸,1英寸=2.54厘米
比如常见的屏幕尺寸有2.4、2.8、3.5、3.7、4.2、5.0、5.5、6.0等

屏幕分辨率

屏幕分辨率是指在横纵向上的像素点数,单位是px,1px=1个像素点。一般以纵向像素*横向像素,如1960*1080。目前市场主流分辨率有八种:1280*720、1920*1080、2560*1440、800*480、1184*720、960*540和854*480。

dpi(Dot per inch)

dpi是屏幕像素密度,假如一英寸里面有160个像素,这个屏幕的像素密度就是160dpi。mdpi、hdpi、xdpi、xxdpi用来修饰Android中的drawable文件夹及values文件夹,用来区分不同像素密度下的图片和dimen值。
那么如何区分呢?Google官方指定按照下列标准进行区分:

名称 像素密度范围 图标尺寸
mdpi 120dpi ~ 160dpi 48*48px
hdpi 160dpi ~ 240dpi 72*72px
xdpi 240dpi ~ 320dpi 96*96px
xxdpi 320dpi ~ 480dpi 144*144
xxxdpi 480dpi ~ 640dpi 192*192

dp/dip

dip和dp是一个意思,都是Density Independent Pixels的缩写,即密度无关像素,规定以160dpi为基准,1dip=1px,如果密度是320dpi,则1dip=2px,以此类推。

desity

密度,表示一个dp多少个像素。desity = dpi/160,dp = desity*px

SW的适配原理

SW全称是Smallest Width,表示最小宽度,例如一个适配文件夹values-sw411dp表示如果手机的最小宽度是411dp,那么就命中该文件夹,使用的配置都是这个文件夹下的。代码中可以用getResources().getConfiguration().smallestScreenWidthDp获取sw

sw的理论上计算原理

其实这就是一道初中计算题,例如:已知一个5.1寸手机的分辨率为1440*2560(2k屏),求sw?
解析:sw = 1440/desity,desity = dpi/160,dpi = 对角线像素/屏幕尺寸,对角线像素用勾股定理求,多么简单的一道题。

对角线长度=14402+25602‾‾‾‾‾‾‾‾‾‾‾‾‾‾√=2937px

对角线长度=\sqrt{1440^2+2560^2}=2937px

dpi=对角线长度屏幕尺寸=29375.1=576px/inch

dpi = \frac{对角线长度}{屏幕尺寸}=\frac{2937}{5.1} = 576px/inch

density=dpi160=576160=3.6

density = \frac{dpi}{160}=\frac{576}{160} = 3.6

sw=宽度像素density=14403.6=400dp

sw=\frac{宽度像素}{density}=\frac{1440}{3.6}=400dp
理论上是这样的,实际真的是这样吗?

实际结果

调用getResources().getConfiguration().smallestScreenWidthDp获取结果是411,也就是说sw = 411dp,这个时候不淡定了,适配这个手机要用values-sw411dp而不是上面计算的values-sw400dp

原理解析

查看系统源码:

density =  DENSITY_DEVICE / (float)DENSITY_DEFAULT;

也就是:

density =  getDeviceDensity() / (float)160;

getDeviceDensity()源码:

private static int getDeviceDensity() {return SystemProperties.getInt("qemu.sf.lcd_density",SystemProperties.getInt("ro.sf.lcd_density", DENSITY_DEFAULT));
}

这个方法是获取设备密度,这个密度是通过系统的配置项qemu.sf.lcd_density或者ro.sf.lcd_density指定的。为了验证我们的猜想,我们用adb shell看看能不能找到这个配置项。

shell@trltechn:/ $ cd system
shell@trltechn:/system $ cat build.prop|grep density
ro.sf.lcd_density=640

因为两个字符串里都含有density,所以我们模糊查询density,果然被我们找到了其中的一个字段ro.sf.lcd_density,所以设备的dpi是以系统指定为准,这个时候我们再次计算:

density=dpi160=640160=4

density = \frac{dpi}{160}=\frac{640}{160} = 4

sw=宽度像素density=14404=411dp

sw=\frac{宽度像素}{density}=\frac{1440}{4}=411dp
答案与代码获取一样,这就可以很稳的用 values-sw411dp去适配了。

Android用命名含sw的文件夹做屏幕适配原理相关推荐

  1. 关于android的4.2的0文件夹的详解

    关于android的4.2的0文件夹的详解 ---- android 4.0 ---- 在galaxy nexus(GN)手机上userdata分区很大,被挂在/data目录,用户的数据通常是放在sd ...

  2. android 4.2目录结构,关于android的4.2的0文件夹的详解(目录结构挂载分析)

    关于android的4.2的0文件夹的详解 ---- android 4.0 ---- 在galaxy nexus(GN)手机上userdata分区很大,被挂在/data目录,用户的数据通常是放在sd ...

  3. /mnt/sdcard或者/sdcard这是Android手机中SD卡的文件夹路径

    Android系统的开放,使其用户可以自己查看系统和SD卡中的文件夹.就系统和SD卡中常见的目录代表什么意思,下面是一个较实用的总结: 一.SD卡中 1. /mnt/sdcard或者/sdcard这是 ...

  4. 无法移动或重命名“Documents and Settings”文件夹

    无法移动或重命名"Documents and Settings"文件夹 察看本文应用于的产品 文章编号 : 236621 最后修改 : 2006年5月25日 修订 : 5.0 本文 ...

  5. android扫描文件夹过滤文件夹,Android - 简单编写一个空文件/文件夹的扫描器

    Android - 简单编写一个空文件/文件夹的扫描器 前言 顾名思义,空文件就是大小为0字节的文件,空文件夹就是子目录没有文件或文件夹的文件夹 实际上,这个功能在很早就有了,大概是在2012-201 ...

  6. 图片重命名,命名方式为:文件夹名字 + _ 顺序 + .jpg

    图片重命名,命名方式为:文件夹名字 + _ 顺序 + .jpg import ospath = "C:/Users/123/Desktop/111/"i = 1 j = 1 for ...

  7. Android dp方式的屏幕适配-原理(后期补充完整讲解)

    Android dp方式的屏幕适配-原理 传统所说的屏幕适配,其实是针对不同屏幕的UI尺寸适配,即在编写页面时使用了具体的dp.sp值后导致的其他问题. 我之前写过一些相关的文章和工具插件,也收到了很 ...

  8. Android中sw的文件夹数值计算

    SW的适配原理 SW全称是Smallest Width,表示最小宽度,例如一个适配文件夹values-sw411dp表示如果手机的最小宽度是411dp,那么就命中该文件夹,使用的配置都是这个文件夹下的 ...

  9. Android多国语言value语言文件夹命名

    在res目录下建立不同名称的values文件夹 附录 国家地区语言 名称 中文(中国) values-zh-rCN 中文(台湾) values-zh-rTW 中文(香港) values-zh-rHK ...

最新文章

  1. 大佬教你修改pycharm编辑器 简单的四步教你搞定界面风格修改
  2. Apache CXF实战之六 创建安全的Web Service
  3. vscode中调试react
  4. 发现“郝茵晴”:屌丝们的社会性传播实验
  5. 2021牛客多校5 - Double Strings(dp+组合数学)
  6. DjangoHTML页面加载和静态文件加载
  7. mysql 集群备份脚本_mysqldump结合脚本的备份方案
  8. Java并发编程 - Executor,Executors,ExecutorService, CompletionServie,Future,Callable
  9. 番石榴的对象类:Equals,HashCode和ToString
  10. _不懂操作?手把手教你如何在linux下搭建FTP
  11. Hash哈希(hashCode、HashSet 、HashMap)
  12. 《你好,李焕英》口碑爆棚,原来秘诀都隐藏在了影迷的评论里面
  13. conda 删除env_软件包与环境管理神器之conda
  14. (Unity4.7)assetbundle 坑爹总结
  15. golang+linux+pipline
  16. JQuery-Ztree 树插件下载 与 快速入门
  17. spring catch了异常还是回滚了_干货:Spring 踩坑之@Transactional 神奇失效
  18. 简单谈谈MySQL优化利器-慢查询
  19. java-遍历Json
  20. Javaweb分页技术实现

热门文章

  1. 如何学习一门编程语言(转载)
  2. Cell Biolabs——细胞研究丨细胞信号通路和蛋白质生物学
  3. 闪客工具:2020编程框架和语言记录
  4. 阿里云云服务器Kibana配置血泪史
  5. 前端学习第二弹:target属性
  6. C#应用程序界面开发基础——窗体控制(2)——MDI窗体
  7. @Size、@Length、@Max、@Min注解的含义和区别
  8. 面对严峻的就业形势,如何提升自身就业能力,实现顺利就业
  9. 通过Frp实现基于树莓派的网络摄像头
  10. Minigui局部刷新 InvalidateRect