一篇不一样的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/ ...
随机推荐
- YUV/RGB与H264之间的编解码
1.源码下载 http://download.videolan.org/x264/snapshots/ 2.编译 ./configure --prefix=./_install --enable-sh ...
- input file 上传文件类型控制
文件类型 accept *.3gpp audio/3gpp, video/3gpp.ac3 audio/ac3.asf allpication/vnd.ms-asf.au audio/basic.cs ...
- 转帖 移动前端开发之viewport的深入理解
在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport了,只有明白了viewport的概念以及弄清楚了跟viewport有关的meta标签的使用,才能更好地让我们的网页适配或 ...
- 微信小程序学习一 微信小程序的四个基本文件
微信小程序有四种类型的文件 js 类型文件 小程序的逻辑代码文件 小程序对js es6的处理比较友好,基本上我们的es6语法都需要使用babel插件去转化成es5(具体是什么原因,自己可以去了解一下) ...
- 手写Spring事务框架
Spring事务基于AOP环绕通知和异常通知 编程事务 声明事务 Spring事务底层使用编程事务+AOP进行包装的 = 声明事务 AOP应用场景: 事务 权限 参数验证 什么是AOP技术 AO ...
- Spark核心原理初探
一.运行架构概览 Spark架构是主从模型,分为两层,一层管理集群资源,另一层管理具体的作业,两层是解耦的.第一层可以使用yarn等实现. Master是管理者进程,Worker是被管理者进程,每个W ...
- Spring Boot和Spring Cloud学习资源推荐
Spring Boot和Spring Cloud学习资源推荐 比较好的学习资源,分享一下. 1.Spring Boot官方文档:http://projects.spring.io/spring-b ...
- AcWing 227. 小部件厂 (高斯消元)打卡
题目:https://www.acwing.com/problem/content/description/229/ 题意:有很多个零件,每个零件的生产时间都在3-9天之间,现在只知道每个工人的生产部 ...
- Dart 和 Flutter 使用json_annotation和json_serializable来处理json数据教程
在学习fultter的时候突然想到如何去处理从服务器获取的json或者将app中的对象数据转换成json上传给服务器 于是研究一下dart对json数据的处理 首先需要依赖下面的第三方库(这里要强调下 ...
- VS2014:"64位调试操作花费的时间比预期要长",无法运行调试解决办法
解决步骤: 右键管理员运行命令提示符,输入IISRESERT,重启IIS即可