1.几个概念

1.1 屏幕尺寸

屏幕对角线的长度,单位是英寸,计算结果为根号下(屏幕宽度的平方+屏幕高度的平方)
注意屏幕宽度的平方和屏幕高度的平方的单位是英寸

1.2 px

像素,屏幕上最小绘制的点为一个像素

1.3 屏幕分辨率

也叫屏幕的物理尺寸
单位是px 比如一般的屏幕物理尺寸有768x1920,768x1280等等,这里的单位都是px,以768x1920为例,他的意思是该屏幕最多可以绘制768x1920个不重叠的点
我们可以使用以下命令获取手机的物理尺寸
adb shell wm size
Physical size: 768x1280

1.4 屏幕像素密度

单位是dpi(dot per inch),从字面理解,就是每平方英寸可以绘制多少个像素点。
例如768X1280的手机 屏幕尺寸是4.7英寸 那么他的像素密度 = (根号下(7682X12802))/4.7=317.6 约等于320
正经的算法应该是768x1280/(屏幕宽度英寸数x屏幕高度英寸数),但由于我们习惯使用屏幕对角线的长度作为屏幕尺寸,所以有了上面那种算法,计算结果其实相同
我们可以使用以下命令获取屏幕像素密度
adb shell wm density
Physical density: 320

1.5 dp

即dip 是Density Independent Pixels的缩写,意为密度无关的像素。之所以有这个单位,是为了在不同分辨率的屏幕上,显示出相同的效果。(物理尺寸相同)
在Android中规定 在mdpi的屏幕上(屏幕像素密度为160dpi) 1dp=1px

1.6 dp与px的转换

每个dp显示的px数目 = dp * (dpi / 160)
例如在屏幕像素密度为320的屏幕上 1dp = 2px

1.7 为什么需要dp

在屏幕像素密度160的设备 1平方英寸 显示160个像素点
在屏幕像素密度320的设备 0.5平方英寸 显示160个像素点
类似下图

因此,如果使用px作为单位 设置相同的px值 160的设备上显示的控件大小会比320的设备大

已知每个dp显示的px数目 = dp * (dpi / 160)

当前屏幕像素密度=160 假设此屏幕每平方英寸可以显示160个像素点
在当前屏幕 1dp = 1px 因此转化成dp就是160个dp点
屏幕像素密度=320 的屏幕上 每平方英寸可以显示320个像素点,
在当前屏幕 1dp = 2px 因此转换为dp就是160个dp点
也就是说,无论当前屏幕的像素密度是多少,每平方英寸显示的dp点个数相同。dp点的出现,目的是为了在所有类型的设备上设置相同的dp大小,在物理尺寸上显示相同的大小。

1.8 sp

sp的概念类似于dp 只不过sp只用于textSize

2 设备兼容性

参考:https://developer.android.com/training/multiscreen/screensizes

2.1 支持不同的屏幕分辨率或者支持不同尺寸的屏幕的建议

2.1.1 使用 ConstraintLayout

ConstraintLayout的功能类似ReletiveLayout但是GPU渲染性能更高,适合屏幕适配使用

2.1.2 避免使用硬编码的布局尺寸

避免使用dp 而是使用wrap_content以及match_parent,这样可以使此视图适应不同的屏幕尺寸

2.1.3 创建备用布局

关于各种布局的详细解释参考
https://developer.android.com/guide/topics/resources/providing-resources#ScreenSizeQualifier
创建的步骤如下

列举几个常用的备用布局
根据屏幕方向创建布局

最小宽度 layout-sw600dp 代表 当宽度>= 600dp 会使用该文件夹下面的布局


根据屏幕的宽高指定布局

根据屏幕尺寸创建布局

根据横竖屏创建布局

根据屏幕像素密度创建布局
查看DisplayMetrics源码可以知道常见屏幕分辨率

    /*** Standard quantized DPI for low-density screens.*/public static final int DENSITY_LOW = 120;/*** Standard quantized DPI for medium-density screens.*/public static final int DENSITY_MEDIUM = 160;/*** Standard quantized DPI for high-density screens.*/public static final int DENSITY_HIGH = 240;/*** Standard quantized DPI for extra-high-density screens.*/public static final int DENSITY_XHIGH = 320;/*** Standard quantized DPI for extra-extra-high-density screens.*/public static final int DENSITY_XXHIGH = 480;/*** Standard quantized DPI for extra-extra-extra-high-density screens.  Applications* should not generally worry about this density; relying on XHIGH graphics* being scaled up to it should be sufficient for almost all cases.  A typical* use of this density would be 4K television screens -- 3840x2160, which* is 2x a traditional HD 1920x1080 screen which runs at DENSITY_XHIGH.*/public static final int DENSITY_XXXHIGH = 640;


根据APIlevel创建布局

需要注意 虽然Android提供了方便的备用布局方案,比如横屏和竖屏,我们可以使用不同的布局来维护,但是这意味着我们的工作量double了,我们需要维护横屏和竖屏的两种界面,个人建议的方案是 对于复杂的界面(例如横屏和竖屏的界面差别太大,无法使用一个布局兼容横屏竖屏,其他例如分辨率 尺寸不同的情况类似),在这种情况下,我们才应该维护两套布局,否则,还是使用一个布局兼容横屏竖屏更优。
Tips:Android图片文件夹分两种 mipmap 中放图标 drawable中放普通图片

2.2 图片适配

可以使用.9图片和矢量图来进行适配,这两种图片在拉伸上都能很好的适配多种屏幕
如果使用位图Bitmap 则应该准备不同尺寸的Bitmap放到对应屏幕密度的文件夹,否则,如果Android使用图片时没有找到指定的密度下的文件,则会选取一个最接近当前屏幕密度下的图片进行缩放,因此可能存在失真模糊等情况。因此,我们需要在apk支持的主流屏幕密度下创建不同的位图资源
另外,如果我们希望某张图片在任何屏幕密度下面都不进行缩放,那么我们可以将他放到nodpi 的文件夹下

2.3 使用 Fragment 将界面组件模块化

在针对多种屏幕尺寸设计应用时,您希望确保不会在 Activity 之间不必要地重复界面行为。因此,您应该使用 Fragment 将界面逻辑提取到单独的组件中。然后,您可以组合 Fragment 以便在大屏幕设备上运行时创建多窗格布局,或者在手机上运行时将 Fragment 放置在单独的 Activity 中。
例如,平板电脑上的一款新闻应用可能在左侧显示报道列表,而在右侧显示一篇完整的报道。在左侧选择一篇报道时,会更新右侧的报道视图。但是,在手机上,这两个组件应显示在单独的屏幕上。从列表中选择一篇报道时,会改变整个屏幕以显示这篇报道。

红橙Darren视频笔记 界面优化与屏幕适配(下)相关推荐

  1. 红橙Darren视频笔记 界面优化与屏幕适配(上)

    1. 内存泄漏,内存溢出与内存抖动 内存泄漏:GC在内存吃紧去回收内存的时候,无法回收某一块不再使用的内存.随着时间的推移会导致内存溢出,一般是强引用导致 之前有总结过内存泄漏的一些case和解决方案 ...

  2. 红橙Darren视频笔记 bsdiff bspatch 使用(Linux下)

    跟着红橙的视频学习热更新 需要使用到bspatch和bsdiff技术 本来打算在windows上搞的,无奈windows上各种编译错误 也没有提示.一怒之下下了个VMware 装了个虚拟机,结果从下载 ...

  3. 红橙Darren视频笔记 view的绘制流程(下)基于API27

    关于View的测量代码是如何执行到的以及performMeasure的具体流程可以参见上一篇笔记 之前忘了说明 view的绘制流程里面用到的设计模式是模板设计模式 可以参考这篇文章 https://b ...

  4. 红橙Darren视频笔记 仿QQ侧滑效果

    这一篇没有什么新的内容 就是改写 红橙Darren视频笔记 仿酷狗侧滑效果 的侧滑的效果 1.去掉淡入淡出效果 2.加上黑色模板效果 效果: 去掉淡入淡出效果很简单 就是注释掉onScrollChan ...

  5. 红橙Darren视频笔记 类加载机制(API28) 自己写个热修复 查看源码网站

    第一部分 类加载机制 一个Activity是如何被Android虚拟机找到的? 在之前的文章 红橙Darren视频笔记 自定义View总集篇(https://blog.csdn.net/u011109 ...

  6. 红橙Darren视频笔记 UML图简介

    整体架构复制自红橙原视频的课堂笔记 因为他这一课没有博客,所以没有转载链接,CSDN没有转载地址是无法作为转载类型的文章发表的,暂时标记为原创 参考链接 https://blog.csdn.net/r ...

  7. 红橙Darren视频笔记 代理模式 动态代理和静态代理

    红橙Darren视频笔记 代理模式 动态代理和静态代理(Android API 25) 关于代理模式我之前有过相关的介绍: https://blog.csdn.net/u011109881/artic ...

  8. 红橙Darren视频笔记 利用阿里巴巴AndFix进行热修复

    注意 由于AndFix在2017年左右就停止更新了,在最新版本的apk上遇到很多问题,我最终也没有成功进行热修复.本节主要是学习热修复的原理 在上一篇 红橙Darren视频笔记 自己捕获异常并保存到本 ...

  9. 红橙Darren视频笔记 Behavior的工作原理源码分析

    主要coordinatorlayout的代码来自coordinatorlayout-1.0.0-sources.jar 本文从源码介绍 CoordinatorLayout 的 behavior 怎么工 ...

最新文章

  1. acl中in和out的区别
  2. 普加甘特图集成到第三方JS框架(MiniUI、jQuery、Ext等)
  3. android上的i-jetty (1)环境搭建
  4. 【Linux】一步一步学Linux——unset命令(202)
  5. ASP.NET : Kerberos网络认证过程
  6. 单体 soa 微服务 区别_漫谈何时从单体架构迁移到微服务?
  7. 华为软件java笔试_华为软件笔试题4.10
  8. java控制台输出等腰三角形,并且是倒序正序输出【原创】
  9. Magento报错之SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry for key 1
  10. 二叉树层序遍历算法实现
  11. java ojdbc7_ojdbc7 / ojdbc8中的charset问题与ojdbc6
  12. oracle中的存储过程和存储函数的区别
  13. 计算机对教育的重要性 英语作文,关于教育的英语作文 教育重要性英语作文!
  14. ubuntu18.04 netplan 设置dns,dns不生效
  15. c语言投票程序设计,C语言课程设计-投票程序设计.doc
  16. 1958年第一台电子计算机,第一台电子计算机
  17. 微信抢票应用个人总结
  18. Redis - CLUSTER命令中槽管理命令详解
  19. 代码实现微信8.0特效
  20. 3.3 CPU共享功能

热门文章

  1. 第二十二课php注入,php第二十三节课
  2. 勘误:EOS资源抵押退还
  3. 获取组织分类后群数据
  4. awk命令和grep命令的使用
  5. 闭包允许内层函数引用父函数中的变量,但是该变量是最终值
  6. PAT乙级(1034 有理数四则运算)
  7. html实现平面地图效果,HTML5 光点组成的平面和立体世界地图
  8. 数据安全:英国公司泄露超过100万人的指纹和面部识别数据
  9. 一文详解Kafka API
  10. 云小课|云小课带你快速掌握云数据迁移CDM