一篇不一样的Android屏幕适配具体做法(原创)
转载请注明出处(http://www.cnblogs.com/weizhxa/p/7568090.html )
有不正确,还请大家留言修正!
1、何谓屏幕适配:在任何设备上看起来布局都是近似的,细分也就是控件的比例是基本一致的。由于我们在定义控件的尺寸时一般使用的是dp和sp,所以最终也就是求不同设备上dp和sp的比例。
2、屏幕适配做法:
2.1 总结
2.1.1 根据像素密度进行屏幕适配:目前需要适配的像素密度一般为hdpi、xhdpi、xxhdpi、xxxhdpi;所以先在res文件夹下创建vaelus-hdpi、values-xhdpi、values-xxhdpi、values-xxxhdpi文件夹,并在各文件夹下建立dimen.xml文件;
2.1.2 根据美工所给图确定对应的像素密度(像素密度计算公式:像素密度=√{(长度像素数^2+宽度像素数^2)}/屏幕尺寸,一般美工给图为720p或者1080p,则对应的像素密度一般归为360dpi或者480dpi,即xhdpi和xxhdpi),用给定图中的px尺寸计算美工图所表示的dp尺寸(例如1280x720的美工图中,在图中一个控件的宽为96px,则1dp=2px[dp与px的换算公式如下所示,原理请百度],在values-xhdpi的dimen.xml文件中就可以标注此控件的大小为48dp);如果是文字,同样可以换算为dp(或者sp,sp有缺点,在2.1.4讲述。),换算公式同控件。
2560x1440 1920x1080 1280x720 800x480
xxxhdpi xxhdpi xhdpi hdpi
1dp = 4 3 2 1.5 px
2.1.3 将其它res文件尺寸通过比例关系进行计算,实现尺寸文件;
dp以及sp在不同资源尺寸下的转换公式:
2560x1440 1920x1080 1280x720 800x480
xxxhdpi xxhdpi xhdpi hdpi
dp 宽 1 1 1 5/6=0.833
高 1 1 1 8/9=0.889
sp 宽 1 1 1 5/6=0.833
高 1 1 1 8/9=0.889
sp取中间值 1 1 1 0.85
注释:上表意为:如果美工给了我们1280x720p的图,那么我们在进行尺寸定义时,xxxhdpi、xxhdpi、xhdpi下的dp和sp尺寸都是一致的,hdpi下的尺寸dp的宽需要 *0.833,高需要*0.889,sp需要*0.85,即可获得hdpi下的尺寸文件。
2.1.4 文字使用sp的问题:如果文字使用sp,则当系统字体改变大小时(例如从超大改为标准),字体会跟着变化,我们可以使用dp来消除这种现象。
2.2 分析
2.2.1 首先确定屏幕支持类型,目前一般支持hdpi、xhdpi、xxhdpi、xxxhdpi即可;
2.2.2 根据美工给的图来进行基础作业:美工一般可以给xhdpi或者xxhdpi的图,也就是720或者1080p的图;将美工做的图所标px尺寸换算为dp尺寸,换算公式是xhdpi的px/2,xxhdpi的尺寸PX/3,实现所有页面时的尺寸和文字大小全部放入res的dimen文件夹中;
2560x1440 1920x1080 1280x720 800x480
xxxhdpi xxhdpi xhpid hdpi
1dp = 4 3 2 1.5 px
2.2.3 补齐hdpi、xhdpi、xxhdpi、xxxhdpi下的尺寸文件大小。换算公式如下(注:此公式以1080p或者720p为单位计算):最后在手机上就反应出来控件在任何手机上的宽和高都看起来是比例一样的。
dp比例算法:
dp:将某一尺寸下的数据换算为别的数据公式:
例如美工给图中,设备尺寸为宽d,高e,单位为px,px与dp换算关系为f,某控件宽为x、高为y, 单位为px,则在其它尺寸中,假设目标尺寸设备宽为a,高为b,单位为px,px与dp换算关系为c,假设此控件在此设备的宽为x1、高为y1, 单位为px;
则美工给图的尺寸换算为dp为:
源dp:
宽[dp] k = x/f 宽[百分比] = x/d x=kf
高[dp] l = y/f 高[百分比] = y/e y=lf
目标dp:
宽[dp] = x1/c 宽[百分比] = x1/a
高[dp] = y1/c 高[百分比] = y1/b
为了达到屏幕适配的目的(控件展现效果一致,即宽高基本一致),则有:
x/d = x1/a , y/e=y1/b
则x1 = ax/d , y1 = by/e
则目标dp:
宽[dp] = x1/c = ax/cd
高[dp] = y1/c = by/ce
则目标dp与源dp的换算公式为(k和l分别代表源dp的宽和高):
目标dp:
宽[dp] = ax/cd = akf/cd = k * (af/cd)
高[dp] = by/ce = blf/ce = l * (bf/ce)
带入abcdef则:目标控件的高宽分别为源高宽的:
dp转换公式:
源设备 b a c 目标设备 e d f 宽 高
xxxhdpi: 2560 1440 4 xxhdpi 1920 1080 3 1 1
xhdpi 1280 720 2 1 1
hdpi 800 480 1.5 1.2 1.125
xxhdpi 1920 1080 3 xxxhdpi: 2560 1440 4 1 1
xhdpi 1280 720 2 1 1
hdpi 800 480 1.5 1.2 1.125
xhdpi 1280 720 2 xxxhdpi: 2560 1440 4 1 1
xxhdpi 1920 1080 3 1 1
hdpi 800 480 1.5 1.2 1.125
hdpi 800 480 1.5 xxxhdpi: 2560 1440 4 0.833 0.889
xxhdpi 1920 1080 3 0.833 0.889
xhdpi 1280 720 2 0.833 0.889
所以:基于1080p或者720p的图,计算dp后,直接可用于xxxhdpi、xxhdpi、xhdpi,除以1.2和1.125后分别用于hdpi的高和宽。
sp转换算法公式:
首先我们需要明白sp和px怎么转化:
ppi的运算方式是:
PPI = √(长度像素数² + 宽度像素数²) / 屏幕对角线英寸数
dp:Density-independent pixels,以160PPI屏幕为标准,则1dp=1px,
dp和px的换算公式 :
dp*ppi/160 = px。比如1dp x 320ppi/160 = 2px。
sp:Scale-independent pixels,它是安卓的字体单位,以160PPI屏幕为标准,当字体大小为 100%时, 1sp=1px。
sp 与 px 的换算公式:sp*ppi/160 = px
总结得出:
px = dp*ppi/160
dp = px / (ppi / 160)
px = sp*ppi/160
sp = px / (ppi / 160)
dp = sp?
所以我们由上面的dp资源文件比例公式表可以得出结论:
sp在不同资源尺寸下的dimen转换公式:
2560x1440 1920x1080 1280x720 800x480
xxxhdpi xxhdpi xhdpi hdpi
sp 宽 1 1 1 5/6=0.833
高 1 1 1 8/9=0.889
整体 1 1 1 8/9=0.889
实践证明:xxxhdpi、xxhdpi、xhdpi的sp是1:1:1的,但是从这3者转到hdpi时用0.833还是0.889呢?其实取哪一个都是可以的,可以取个中间值0.85就可以了。
一篇不一样的Android屏幕适配具体做法(原创)的更多相关文章
- Android 屏幕适配(一)百分比布局库(percent-support-lib) 解析与扩展
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/46695347: 本文出自:[张鸿洋的博客] 一.概述 周末游戏打得过猛,于是周 ...
- 【收藏】Android屏幕适配全攻略(最权威的Google官方适配指导)
来源:http://blog.csdn.net/zhaokaiqiang1992 更多:Android AutoLayout全新的适配方式, 堪称适配终结者 Android的屏幕适配一直以来都在折磨着 ...
- Android屏幕适配全攻略(最权威的官方适配指导)(转),共大家分享。
Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...
- 【转】Android屏幕适配全攻略(最权威的官方适配指导)
原文网址:http://blog.csdn.net/jdsjlzx/article/details/45891551 Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的 ...
- Android屏幕适配全攻略(最权威的官方适配指导)
转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入 ...
- Android 屏幕适配:最全面的解决方案
转自:https://www.jianshu.com/p/ec5a1a30694b 前言 Android的屏幕适配一直以来都在折磨着我们Android开发者,本文将结合: Google的官方权威适配文 ...
- Android 一种非常好用的Android屏幕适配
前言 网上关于屏幕适配的文章已经铺天盖地了,为什么我还要讲?因为网上现在基本都是使用px适配,即每种屏幕分辨率的设备需要定义一套dimens.xml文件.再加上有些手机还有虚拟按键(例如华为),这样就 ...
- 好用的Android屏幕适配
前言 网上关于屏幕适配的文章已经铺天盖地了,为什么还要讲?因为网上现在基本都是使用px适配,即每种屏幕分辨率的设备需要定义一套dimens.xml文件.再加上有些手机还有虚拟按键(例如华为),这样就还 ...
- Android屏幕适配全攻略(最权威的官方适配指导)屏幕尺寸 屏幕分辨率 屏幕像素密度 dpdipdpisppx mdpihdpixdpixxdpi
Android屏幕适配全攻略(最权威的官方适配指导)原创赵凯强 发布于2015-05-19 11:34:17 阅读数 153734 收藏展开 转载请注明出处:http://blog.csdn.net/ ...
随机推荐
- 转载:Think in AngularJS:对比jQuery和AngularJS的不同思维模式(大漠穷秋)
导言 stackoverflow上有一个人问了一个问题:如果我有jQuery背景,我应该如何切换到AngularJS的思维模式? 有一个回复非常经典,获得了两千多票. 为了让国内开发者也能领略到其中的 ...
- bootstrap.yml
spring: jpa: properties: hibernate.enable_lazy_load_no_trans: true application: name: paycore cloud: ...
- 调整Winfrom控件WebBrowser的默认浏览器内核版本
一.问题解析: 今天在调试程序的时候,需要使用C#的客户端远程登录一个Web页面,用到了WebBrowser控件.但是却发现了一件很神奇的事情:当前浏览器使用的内核,可以通过访问下面这个网站获取:ht ...
- 浅谈JavaScript原型图与内存模型
js原型详解 1.内存模型: 1.原型是js中非常特殊一个对象,当一个函数(Person)创建之后,会随之就产生一个原型对象 2. 当通过这个函数的构造函数创建了一个具体的对象(p1)之后,在这个具体 ...
- python_suit
全局变量 Json:双引号 Suite :ddt中不能用 suit.add(test),应该用 suit.add(loader)
- OpenCV常用基本处理函数(5)图像模糊
2D卷积操作 cv.filter2D() 可以让我们对一幅图像进行卷积操作, 图像模糊(图像平滑)使用低通滤波器可以达到图像模糊的目的.这对与去除噪音很有帮助.其实就是去除图像中的高频成分(比如:噪音 ...
- C语言小笔记(1)
枚举类型的大小是4,和一个int整形大小一样 就是最后一个逗号后面的表达式的值,比如: int a=1,b; b=(a+1,a+2,a+3); 那么b的值就是a+3,也就是4 函数名 :print ...
- 二叉树入门(洛谷P1305)
题目描述 输入一串完全二叉树,用遍历前序打出. 输入输出格式 输入格式: 第一行为二叉树的节点数n. 后面n行,每一个字母为节点,后两个字母分别为其左右儿子. 空节点用*表示 输出格式: 前序排列的完 ...
- delphi文件类型
1.DPR: Delphi Project文件,包含了Pascal代码.应用系统的工程文件2.PAS: Pascal文件,Pascal单元的源代码,可以是与窗体有关的单元或是独立的单元.3.DFM:D ...
- iframe中涉及父子页面跨域问题
什么是跨域? 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器施加的安全限制.所谓同源是指相同的域名.协议和端口,只要其中一项不同就为跨域. 举几个例子: http:/ ...