一、初步思考
  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. 深入理解Ember-Data特性(下)

    写在前面 最近比较忙,换了新工作还要学习很多全新的技术栈,并给自己找了很多借口来不去坚持写博客.常常具有讽刺意味的是,更多剩下的时间并没有利用而更多的是白白浪费,也许这就是青春吧,挥霍吧,这不是我想要 ...

  2. 在ASP.NET WebAPI 中使用缓存【Redis】

    初步看了下CacheCow与OutputCache,感觉还是CacheOutput比较符合自己的要求,使用也很简单 PM>Install-Package Strathweb.CacheOutpu ...

  3. 一次与51aspx客服MM谈话 -- 坑是怎么发展的

    GG从发布以来,我每次版本更新都会同步到51aspx源码网站,这次在同步更新GG V3.2版本到51aspx时,出了点小状况: 上传3.2版本几个小时后,我再次上去查看,发现其状态变成了“退回”,于是 ...

  4. Asp.Net MVC中使用ACE模板之Jqgrid

    第一次看到ACE模板,有种感动,有种相见恨晚的感觉,于是迅速来研究.它本身是基于bootstrap和jqueryui,但更nice,整合之后为后台开发节省了大量时间. 发现虽然不是完美,整体效果还是不 ...

  5. 【开源】开发者新闻聚合APP 1.0.3发布(第一个稳定版本,短期内不再发布新版本)

    聚合了博客园新闻.infoq新闻.36kr新闻.oschina新闻.51cto新闻.csdn新闻: 争取做到随时刷随时有开发者的新闻! 目前还只支持安卓APP 最新版本的下载地址:https://gi ...

  6. 消息队列-rabbitMQ

    消息队列两个用处:服务间解耦,缓解压力(削峰平谷),以前用过ZMQ.狼厂内部的NMQ,现在接触了java开源的kafka和RabbitMQ.目前先不求甚解,有个大概的认识. RabbitMQ的安装和入 ...

  7. Qt类继承图

    对于学习Qt的,有一个Qt所有类的继承图表,是很有需要的.以下提供了Qt5.1的所有类的继承关系图.看的时候,可以放大和缩小.如需文档下载,可以加入最后的QQ学习群.

  8. IOS Socket 04-利用框架CocoaAsyncSocket实现客户端/服务器端

    这篇文章,我们介绍CocoaAsyncSocket框架的使用,主要介绍实现客户端/服务器端代码,相信在网上已经很多这样的文章了,这里做一下自己的总结.这里介绍使用GCD方式 一.客户端 1.下载地址 ...

  9. shell 中命令输入的快!捷!键!

    非常棒!! 非常棒!! 删除ctrl + d 删除光标所在位置上的字符相当于VIM里x或者dlctrl + h 删除光标所在位置前的字符相当于VIM里hx或者dhctrl + k 删除光标后面所有字符 ...

  10. vi 卡住怎么办

    http://zhidao.baidu.com/question/93283359.html ---------- 我貌似好像按了ctrl+s... 用惯了windows人,会习惯性地按Ctrl+S来 ...