一、初步思考
  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布局尺寸思考的更多相关文章

  1. [置顶] xamarin android 布局尺寸了解

    为了使UI界面在不同大小的移动端显示器上能够正常显示,大家可能都知道使用sp作为字体大小的单位,dp作为其他元素长度的单位. 前几天看了一篇文章关于 App设计规范的,文章用心写的非常好,这里是链接  ...

  2. Android布局优化思考

    一.关于RelativeLayout和LinearLayout的使用 由源码可以知道,RelativeLayout需要对其子View进行两次measure过程,而LinearLayout只需一次mea ...

  3. android 布局如何支持多种不同屏幕尺寸

    android 布局如何支持多种不同屏幕尺寸 --关于dp.layout-xxx.drawable-xxx作用的小结 转载自:http://blog.csdn.net/vincent_blog/art ...

  4. 转:Android布局优化

    categories: Android 在Android开发中,我们常用的布局方式主要有LinearLayout.RelativeLayout.FrameLayout等,通过这些布局我们可以实现各种各 ...

  5. Android 布局详解

    Android 布局详解 1.重用布局 当一个布局文件被多处使用时,最好<include>标签来重用布局. 例如:workspace_screen.xml的布局文件,在另一个布局文件中被重 ...

  6. Android布局管理详解(1)—— LinearLayout 线性布局

    Android的布局方式共有6种,分别是LinearLayout(线性布局).TableLayout(表格布局).FrameLayout(帧布局).RelativeLayout(相对布局).GridL ...

  7. 移动端App开发 - 02 - iPhone/iPad/Android UI尺寸规范

    移动端app开发 - iPhone/iPad/Android UI尺寸规范 本笔记抛去无用的前期分析什么的,全是干货,简洁干练 本笔记不单独针对 ios 或者 Android,两种都介绍,当然我们实际 ...

  8. iPhone/iPad/Android UI尺寸规范 UI尺寸规范,UI图标尺寸,UI界面尺寸,iPhone6尺寸,iPhone6 Plus尺寸,安卓尺寸,iOS尺寸

    iPhone/iPad/Android UI尺寸规范 UI尺寸规范,UI图标尺寸,UI界面尺寸,iPhone6尺寸,iPhone6 Plus尺寸,安卓尺寸,iOS尺寸 iPhone界面尺寸 设备 分辨 ...

  9. 【转】在Android布局中使用include和merge标签

    内容转自:http://fengweipeng1208.blog.163.com/blog/static/21277318020138229754135/ 在我们开发android布局时,经常会有很多 ...

随机推荐

  1. Linux 网络编程(IO模型)

    针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...

  2. JavaScript使用DeviceOne开发实战(六)点墨真实案例

    qq群里的yan用户开发的App,基本完工大家可以看看 安装二维码是 QQ群:365443130

  3. 客户端GUI程序开发漫谈

    这篇文章包含了这个领域的很多开源项目的介绍,还有我多年来的心血和汗水  去年夏天的时候,我用QT做了一个小工具 后来还用QT做了流程设计器 我把程序分享给飞扬青云之后,他甚至搞出来一套QT的皮肤来 说 ...

  4. [异常解决] ubuntu上安装虚拟机遇到的问题(vmware坑了,virtual-box简单安装,在virtual-box中安装精简版win7)

    利用周末时间将整个电脑格式化,换成了ubuntu系统- 所谓:扫清屋子再请客! 但是有些软件只在win上有,于是还是考虑装个虚拟机来个——逐步过度策略,一点点地从win上转移到linux上 我的系统是 ...

  5. 做NavMesh相关工作时收集的一些文章

    三角形拾取 http://www.blackpawn.com/texts/pointinpoly/default.htmlCS NavMesh使用手册https://developer.valveso ...

  6. Ubuntu下解决adb devices:???????????? no permissions的方法

    之前一直都是在windows下进行开发的,但是这次由于一个小模块用的东西只能在linux下运行,所以就发生了这么一系列的问题环境:虚拟机Vmware下的Ubuntu12.10事件:连接android手 ...

  7. as3 同屏1000+动画,不掉帧。解决方案。

    原理就是在一个enterframe里面,把1000个对象画到一个bitmapdata,然后交给舞台显示.

  8. git 修改管理

    查看修改: 撤销某一文件的修改(还没提交): 撤销所有文件的修改: git checkout .

  9. PowerDesigner实用操作

    1. 让PhysicalDiagram里的表显示字段名Tools→Display Preferences→在General Settings里选择Table→点击Advanced→选择Form下的Co ...

  10. Redis学习笔记~StackExchange.Redis实现分布式Session

    回到目录 对于多WEB的环境现在已经是必须的了,很难想像一台WEB服务器面对百万并发的响应,所以,我们需要多台WEB服务器集群合作,来缓解这种高并发,高吞吐的场景,而对于多WEB的场景又会有个问题出现 ...