转载:http://www.jianshu.com/p/29ef8d3cca85

首先我们看看百度搜索引擎上常见的认识入手:

图1:屏幕分辨率和常见屏幕密度关系

我们知道屏幕密度直接关系到我们所谓的1X  1.5X  2X  3X  4X图的对应适配关系,结合图1可知:

  1. 屏幕密度跟屏幕分辨率可能有关系;
  2. 实操过安卓适配的同学应该了解,并不是所有的生厂商都会做规规矩矩的屏幕分辨率;

单位解释篇

想要通透得了解关于安卓各机型的适配关系还得从常见的单位入手,dp/px/sp/PPI/DPI

dp=dip=density-independence pixel=独立设备像素:可以理解为类似现实中厘米的功能,当成是一个物理单位,1dp=1in/160ppi=2.54cm/160ppi≈0.016cm,使文字和图片在不同屏幕手机中看上去差不多大;

px=pixel=像素:这是我们用Ps、AI出设计稿时的常用单位,在启动Ps的第一时间我们应该都会将首选项中的单位设置为px 不多做介绍;

sp=Scale-independent pixels=尺度独立像素(翻译待考证):是安卓的字体单位,在安卓系统设置中我们可以定义字体大小,以MIUI为例

图2:MIUI7.1字体大小设置界面

在标准模式下(字体是100%)时,1sp=1dp,我们知道iOS HIG里面说过内容样式大尺寸为17pt(iOS中的默认size),以此为参考,安卓中常用的字号为16±dp(安卓可能出现1.5X图 所以取偶数)

PPI=Pixel Per Inch=像素密度;  DPI=Dots Per Inch=点密度;

点原来是印刷上的计量单位;像素是电脑显示器的计量单位;印刷行业规 1点=0.35mm=1/72英寸;针对显示器设计的分辨率为 72像素/英寸;在针对显示器的设计中我们可以认为DPI=PPI

PPI计算篇(前方高能)

新手机发布必备的参数一定会有屏幕分辨率(1920*1080),屏幕尺寸(5.0英寸),有心的同学会去官网查询一下具体的PPI值,这里跟大家解释一下这三者的转换关系,以便大家更好地理解安卓适配:

假设屏幕分辨率为W*H(px),物理尺寸为a*b(inch),

则我们常说的屏幕尺寸c(如5.0英寸)其实是对角线的长度,因此:

公式1:勾股定理

而PPI是像素密度,指的是屏幕单位宽的像素数:

公式2:屏幕密度定义

由此我们推理出:

公式3:由公式2推理

因此我们可以得出一个大百度烂大街的PPI DPI计算公式:

公式4:PPI计算公式

以上一大串的公式其实想说明的是:

  1. 公式4表面意义似乎是-PPI是屏幕分辨率用勾股计算出的对角线像素数/屏幕尺寸;
  2. 事实上,我们知道一个2*2px的屏幕,对角线像素数也是2px,并不符合勾股定律的计算公式;
  3. 正确理解公式的推理过程,才能正确理解屏幕适配原理;

dp与px换算篇

首先引入dp和px的转换公式

px=dp*(ppi/160)

简单陈述一下公式的实际计算方法:

任何一款机型,我们计算或从官方参数得到PPI值后,将PPI/160,得到任何含小数点的值后,舍掉小数,整数进一位就是我们的dp px的转换关系,即1.5X  2X  3X  4X图的适用关系,用函数表达即  ceil(PPI/160);相除得整数则直接可用:

267ppi机型,ceil(1.67)=2  该机型用2X设计稿

423ppi机型,ceil(2.64)=3  该机型用3X设计稿

至此我们知道图1的关系其实还是too young too naive,附上一个较为成熟的关系图:

图3:屏幕密度范围与倍图对应关系

主流手机屏幕尺寸及分辨率

整理了一些主流机型的参数屏幕并附上:置灰文字说明:未查询到官方数据,为个人计算结果

数据统计包括魅族/小米/华为/三星/HTC/MOTO/VIVO/SONY截止到2016.2的主流机型

图4:主流机型参数及倍图关系整理

由图4可见,在大屏手机时代,3X机型成为了主流机型(暂时忽略机型市场占有率);1X机型基本绝迹;4K手机屏也在悄悄进入市场;

一稿适配篇

有限的时候我们如何出多张不同分辨率的效果图

首先建议以2X图尺寸(1280*720)为设计原稿进行设计(由图4可见,1X适配机型基本已经绝种),然2X只需要设计时注意偶数原则即可方便进行适配;另外设计稿也有可能会被要求直接用于iOS,或iOS设计稿直接改改成了安卓的设计稿(iOS主流还是@2X);假设我们手里有一份1136*640(iPhone5/5s) 原稿高保真设计稿,要去适配iOS其它机型及安卓机型:

因为iOS的尺寸比较有代表性,能说明问题,方法在安卓各机型适配过程中通用:

图5:一稿适配方法

需要注意的是,图标在放大过程中可能会出现锯齿(所谓虚边),防锯齿需要注意的点有很多,其中最主要的一条是 尽量保持图标文件的形状属性(切忌使用位图素材、栅格化图层、转为智能对象)

一点小技巧,在2X→3X过程中,我们可以全选图层,Cmd+T后 讲变形中心移动到画板左上角的位置,再进行150%变形,会便捷很多;

这次的内容就写到这里,请大神随便拍;

61.Android适配的那些P事(转)的更多相关文章

  1. Android 适配(一)

    一.Android适配基础参数 1.常见分辨率(px)      oppx 2340x1080      oppR15 2280x1080      oppor11sp 2160*1080       ...

  2. android适配全机型悬浮框、视频APP项目、手势操作、Kotlin妹子App、相机图片处理等源码

    Android精选源码 图片滤镜处理,相机滤镜实时处理,相机拍照录制 android仿爱壁纸App更换壁纸效果源码 基于Kotlin+MVP+Retrofit+RxJava+Glide 等架构实现短视 ...

  3. Android 适配2

    Android AutoLayout全新的适配方式 堪称适配终结者 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/4999094 ...

  4. 从cocos2dx源代码看android和iOS跨平台那些事

    cocos2dx一个跨移动(平板)平台的游戏引擎,支持2d和3d,基于c/c++,网上介绍多在此不详叙.我们本篇关心的是跨平台那些事,自然而然就找到platform目录.好家伙,支持的操作平台还真不少 ...

  5. 腾讯优测优分享 | Android适配中的一些特殊情况小结

    腾讯优测是专业的自动化测试平台,提供全面兼容适配测试,远程真机租用等多维度的测试服务! 作为一名"艰苦卓绝"的软件工程师,我在开发路上经常被各种奇葩情况虐的体无完肤...今天就想与 ...

  6. !! 据说年薪30万的Android程序员必须知道事

    http://www.th7.cn/Program/Android/201512/742423.shtml Android中国开发精英 目前包括: Android开源项目第一篇——个性化控件(View ...

  7. Android适配(屏幕适配、国际化适配)-转

    首先来说一下Android的屏幕适配: 关于Android屏幕的一些基本概念知识,自行充电..在此只介绍实际开发过程中的使用 1.说到Android的屏幕适配,首当其冲的就是图片的适配 图片适配遵循两 ...

  8. Android studio gradle 打包 那些事

    总结了一下 目前觉得比较好用的gradle 和一些打包 经验.放在这里. 首先说下 渠道号 这个概念,我们经常会统计我们的api 访问来源 是来自于那个app store,这有利于 我们针对性的推广. ...

  9. 关于Android适配华为等带有底部虚拟按键的解决方案

    http://blog.csdn.NET/a91694451/article/details/50469857 最近公司的项目里遇到了一个问题,就是最后适配的时候时候同事的华为手机时,由于底部带有虚拟 ...

随机推荐

  1. HTML 学习笔记 JavaScript (变量)

    变量是储存信息的容器. 实例 var x=2; var y=3; var z=x+y; 就像代数那样 x=2 y=3 z=x+y 在代数中,我们使用字母(比如 x)来保存值(比如 2).通过上面的表达 ...

  2. nodejs里的module.exports和exports的关系

    关于node里面的module.exports和exports的异同,网上已经有很多的资料,很多的文章,很多的博客,看了很多,好像懂了,又好像不懂,过几天又不懂了...大致总结是这样的: //下面这种 ...

  3. git push上传代码到gitlab上,报错401或403

    之前部署的gitlab代码托管平台,采用ssh方式连接gitlab,在客户机上产生公钥上传到gitlab的SSH-Keys里,则git clone下载和git push上传都没问题,这种方式很安全. ...

  4. js函数命名常用动词

    get 获取/set 设置, add 增加/remove 删除 create 创建/destory 移除 start 启动/stop 停止 open 打开/close 关闭, read 读取/writ ...

  5. Centos6 安装 Redis

    先确认gcc和tcl已经安装 sudo yum install gcc-c++ sudo yum install tcl 解压, 编译和安装 .tar.gz /usr/src/ cd /usr/src ...

  6. 启动Eclipse后卡在 android sdk content loader 的解决办法

    Make sure that eclipse is not active. If it is active kill eclipse from the processes tab of the tas ...

  7. 04传智_jbpm与OA项目_部门模块改进_直接在BaseAction中实现ModelDriven<T>

    这个项目是用Struts2做的,我这里单独写了一个BaseAction,用来存放所有的功能模块的Action的公共部分, 刚开始的做法是这个BaseAction只会继承ActionSupport 并不 ...

  8. 15个nosql数据库

    1.MongoDB 介绍 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.主要解决的是海量数据的访问效率问题,为WEB应用提供可扩展的高性能数据存储解决方案.当数据量达到50GB以上 ...

  9. 从C++研发到前端工程师

    前言 伴随着今天收到了网易的前端offer,我的转行面试告一段落.能拿到网易的offer很意外,也弥补了去年网易校招被刷的遗憾.虽然从c++转行到前端不是一件很困难的事,但是也说不上轻松,反正我用了整 ...

  10. 天龙客户端的GameManager

    看天龙的结构,奇怪为什么这么多直接继承了MonoBehaviour,而不是自己实现一套帧频更新呢,两者利弊都在哪? 从顶层来看看GameManager的单件. 管理了当前的载入的场景(ActiveSc ...