一、初步思考
  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. ASP.NET MVC 学习笔记(一)

    很久很久没有在博客园写过东西了,很多大虾也说过展示自己最好的地方就是有一个博客作为笔记,展示一下自己的学习和研究成果. 最近决心将公司的一款产品改用MVC的方式实现,于是乎就开始在园子里面疯狂的寻找各 ...

  2. 如何做到在虚拟数据库和真实数据库之间自由切换?【低调赠送:QQ高仿版GG 4.4 最新源码】

    记得以前在公司上班时,有时候白天的活没干完,我就会把工作带回家晚上加班继续做.但是,我们开发用的数据库是部署在公司局网内部的一台服务器上的,在家里是肯定连不上这台机器的.在家里没有数据库,服务端就跑不 ...

  3. 【转载】关于sql server 代理(已禁用代理xp)

    原文地址:http://blog.sina.com.cn/s/blog_493cafbb0100qy91.html 症状: SQL SERVER2005里面,启动SQL代理服务,启动正常,但是在sql ...

  4. Hello Mybatis 01 第一个CRUD

    What's the Mybatis? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google c ...

  5. openseadragon.js与deep zoom java实现艺术品图片展示

    openseadragon.js 是一款用来做图像缩放的插件,它可以用来做图片展示,做展示的插件很多,也很优秀,但大多数都解决不了图片尺寸过大的问题. 艺术品图像展示就是最简单的例子,展示此类图片一般 ...

  6. 厚积薄发,拥抱 .NET 2016

    厚积薄发这个词是高三英语老师在高考前写在黑板上,高中三年努力这么久,是时候迎面而上,冲刺向前.所以,一想到.NET 2016,脑海里蹦出的第一个词就是它. .NET 2016 是 .NET 一次质的飞 ...

  7. 基于Task的异步模式的定义

    返回该系列目录<基于Task的异步模式--全面介绍> 命名,参数和返回类型 在TAP(Task-based Asynchronous Pattern)中的异步操作的启动和完成是通过一个单独 ...

  8. Git Day02,工作区,暂存区,回退,删除文件

    1st,工作区回退:2st,暂存区回退:3rd,删除文件:

  9. Node.js入门:Node.js&NPM的安装与配置

    Node.js安装与配置      Node.js已经诞生两年有余,由于一直处于快速开发中,过去的一些安装配置介绍多数针对0.4.x版本而言的,并非适合最新的0.6.x的版本情况了,对此,我们将在0. ...

  10. Atitit.软件与编程语言中的锁机制原理attilax总结

    Atitit.软件与编程语言中的锁机制原理attilax总结 1. 用途 (Db,业务数据加锁,并发操作加锁.1 2. 锁得类型 排它锁 "互斥锁 共享锁 乐观锁与悲观锁1 2.1. 自旋锁 ...