首页 > 代码库 > Android布局尺寸思考

Android布局尺寸思考

一、初步思考
  1. 虽然安卓的这个显示适配的方案有点怪,最初也不容易马上理解,不过这个方案确实有其自己的道理,整个思路是清晰的,方案的也是完整的,没有硬伤
  2. 安卓采用的【屏幕密度放缩机制】、与web前端对应的是【屏幕比例放缩机制】
  3. 安卓里边,每一段以dp结尾的数值代表的是一段真实的物理尺寸,对,就是物理尺寸,你甚至可以认为它的单位就是“厘米”!
  4. 除了百分比和物理尺寸,还可以用什么?可以用px,对,用像素点,这个是最原始的,不过这样用会有哪些问题呢?
  5. 使用dp和不同的layout在逻辑上是能适应所有情况的
 
二、深入思考
从源头来说
  1. 布局显示的单位最开始最直接的思路肯定是用px,因为电子屏幕就是由一个个px像素点组成的,所以你定义一个组件的长度的时候自然会使用px
  2. 不过在你使用px之后,你会自然地遇到一个问题:当屏幕变化之后,是否能显示你预想的效果?
  3. 这个问题很棘手,一开始拿到会找不到突破口,因为屏幕千奇百怪,然后实际的使用场景也各不一样,怎么可能有银弹嘛,不过且慢,我们静下心分析
  4. 细细想来,屏幕变化只可能有两个维度:屏幕物理尺寸和屏幕像素多少,而分析几个实际例子可以发现我们其实只关心其中的一个,那就是物理尺寸;另外其实使用场景可以恰当地分离出去,最后筛选出这五种情况
    1. 【1】当屏幕物理尺寸没有变化的时候,无论屏幕像素如何,我们希望的是显示效果也是一样
      1. 因为这是从人眼看物的情况来考虑,人眼看物是根据物理尺寸来的,所以这个基本是个定值
    2. 而当屏幕物理尺寸缩小的时候,就会有个比较复杂的情况了,不过有几个大概规律:
      1. 【2】当缩小地不多的时候,我们基本希望显示内容不变,显示的东西按比例缩小一些
      2. 【3】当缩小地比较多的时候,我们希望显示的内容少一些(其实就是布局发生变化,怎么变化跟具体场景有关)
    3. 而当屏幕物理尺寸放大的时候,同样:
      1. 【4】当放大地不多的时候,我们基本希望显示内容不变,显示的东西按比例放大一些
      2. 【5】当放大地比较多的时候,我们希望显示的内容多一些(其实就是布局发生变化,怎么变化跟具体场景有关)
  5. 把三种布局尺寸机制对比一下
    1. px
      1. 这五条都不能实现
    2. dp
      1. 第一条能够完美实现
      2. 第二条、第四条 是通过几种特殊的尺寸基本及格实现(matchparent、比例布局)
      3. 第三条、第五条 也只能通过上面的特殊尺寸来搞,但是无法实现
    3. 百分比
      1. 第一条能够完美实现
      2. 第二条、第四条 能够完美实现
      3. 第三条、第五条 无法实现
    4. dp+物理尺寸特殊对待机制(就是layou-large文件夹)
      1. 第三条、第五条 基本完美实现
    5. 百分比 +物理尺寸特殊对待机制
      1. 第三条、第五条 完美实现
  6. 所以总体来说,百分比布局比dp布局有少许优势,优势有限
 
三、其他小东西
3.1.dp布局
然后具体说一下dp布局是怎么实现第一条的
  1. 这个分两块,一块的标注的尺寸,一块是图片
  2. 首先对于标注的尺寸,这个不用你管,你直接标dp,不用再多管,那就会是一个物理尺寸了,不随着像素密度变化而变化
    1. 而这里这个dp和px的转换是有严格的公式计算的,非常精确,就是不太好算:
      1. px = dp*ppi/160
      2. dp = px / (ppi / 160)
      3. PPI =( √(长度像素数² + 宽度像素数²)) / 屏幕对角线英寸数
    2. 从这里也可以看到所谓的÷3其实只是计算结果正好是3而已,也可以是2.9 3.2什么的
  3. 然后是对于图片,是根据【原图适配的屏幕密度】来把图片分类放在不同文件夹来实现的(注意跟物理尺寸特殊对待机制区分)
    1. 这里需要具体说,里边有些小绕绕
    2. 首先一张图做出来给你,是你手动决定把图放到哪个文件夹下的(一共有low--medium--high--xhigh--xxhigh几个文件夹)
      1. 你是根据做这张图的人 的【目标屏幕的屏幕密度】来放的
      2. 根据计算得到的屏幕密度,按照谷歌的标准(每个文件夹对应的标准屏幕密度值 )选择一个文件夹
    3. 然后系统会这么进行缩放
      1. 首先系统会识别你的屏幕密度是多少
      2. 然后划分你这个屏幕密度是属于哪个级别【这个标准是什么?】
      3. 然后去对应的级别下的文件夹中去找图片
      4. 如果当前文件夹没有图片,就去前后找(以后为主),找到之后,按照标准比值来缩放(3:4:6:8:12)
      5. 所以随便你怎么放,系统只负责缩放,你也知道怎么放的后果,所以你自己决定怎么放(所以你自己就会有个范围,就是中等分算了)
    4. 这样缩放很明显会有问题,当目标分辨率不是标准分辨率的时候就会不精确
      1. 比如你的目标假如是170,然后你只能放到160的文件夹下,然后如果拿一个170的手机去跑,你会发现图片明显缩小了
    5. 评论:
      1. 图片放缩有问题,除非可以自定义屏幕密度文件夹
      2. 如果不可以自定义的话,可以用尺寸固定imageview的大小,然后用src的最小边中心放缩
 
3.2.UI做的像素图怎么跟手机运行的效果图比较?
  1. 所有对应的目标尺寸的机型的截图是比例对齐的
    1. 原图为px图A
    2. 如果设定目标尺寸是5.5,那么用5.5的机子跑下来截图B,用4.7的机子跑下来截图C
    3. 如果设定目标尺寸是4.7,那么用4.7的机子跑下来截图D,用5.5的机子跑下来截图E
    4. A、B、D比例适应
    5. C和E跟上面都不比例适应

      

博友中秋快乐~

Android布局尺寸思考