android 分辨率适配与dip(dp)的使用
来源:互联网 发布:js 对象转字符串 编辑:程序博客网 时间:2024/06/12 04:46
如果想在不同型号手机对同一个应用做适配,如果你在xml中全部使用dp没有使用px,那么适配上依然很有可能出问题!
无数人存在误区,认为自己使用的都是dp,为什么在手机A上面和手机B上面看上去比例不一样,为什么在A手机上显示正好而手机B上却显示到屏幕外面
每次解释的都很累,所以写此blog
首先先明确几个概念
density值表示每英寸有多少个显示点(*)
dip/dp: device independent pixels(设备独立像素)
注意:dip与屏幕密度有关,屏幕密度与硬件有关,硬件设置不正确,有可能导致dip不能正常显示。在屏幕密度为160的显示屏上,1dip=1px
下面是一些分辨率信息
名称分辨率屏幕密度QVGA320*240120WQVGA400400*240120WQVGA432432*240120HVGA640*480160WSVGA1024*600160WXGA8001280*800160WVGA800800*480240WVGA854854*480240WXGA7201280*720320
下面没有特殊说明的话,屏幕的宽度都指其像素数
我们在手机A上面放了一张图片,120px宽,手机屏幕240px宽,也就是说图片的宽度占了整个屏幕的一半
如果把应用安装在手机B上,B的宽度=320px,那么我们希望图片宽度为多少呢?如果大家希望按着比例缩放,那图片宽度应该是160px,占屏幕宽度的50%
如果我们在xml中使用的单位为dp,下面看看如何保持这个比例:
px = (density/160)dp(density这里是(*)的意思)
我们把所期待的比例记为rate,baseDensity=160,屏幕的宽度(像素数)为x,屏幕密度为density
那么rate=((density/baseDensity)*dp)/x;
这里baseDensity是已知的=160,dp也是已知的,因为是你写的嘛。
未知的是density屏幕密度和屏幕宽度x
rate可以写为:
rate=(dp/baseDensity)*(density/x);
现在情况就比较明朗了,rate=K(常数)*(density/x);
如果想保持rate不变,那么需要保证density/x保持比例
给数学不好的同学多解释两句
想保持rate的话,必须要手机A的屏幕密度/屏幕宽度=手机B的屏幕密度/屏幕宽度
或者说手机A的屏幕密度/手机B的屏幕密度=手机A的屏幕宽度/手机B的屏幕宽度
同样,如果你要保持纵向也保持等比缩放,那么也同样需要保持比例。
只有这样,你的应用才能看上去是等比缩放的。
使用dp保持比例只和这些有关,和你屏幕大小半点关系都没有。
还有另一种方式来保持比例:就是直接使用比例方式定义组件大小
但是很有局限性,只有LinearLayout中可以使用android:layout_weight属性
其实很容易理解,给大家举个例子
很多人觉得,如果项目中全部使用dp,那么就可以完美移植。
我们的一个移植项目,任务是把应用从A(分辨率为WXGA720=1280*720)移植到B(分辨率WVGA800=800*480)
其中A的密度=320,B的密度为240
我们现在来看看A横向有多少个dp
A dp数=720/(320/160)=360
B dp数=480/(240/160)=320
手机A横向有360个dp,如果你的图片占用360个dp,B去哪找你多出来的40dp呢!必然它会显示在屏幕外面阿!
ps:下面是一点相关内容
下面是函数void android.util.DisplayMetrics.setToDefaults() 其中density变量注释如下
density变量注释 写道 粗略的翻译了一下:
无数人存在误区,认为自己使用的都是dp,为什么在手机A上面和手机B上面看上去比例不一样,为什么在A手机上显示正好而手机B上却显示到屏幕外面
每次解释的都很累,所以写此blog
首先先明确几个概念
density值表示每英寸有多少个显示点(*)
dip/dp: device independent pixels(设备独立像素)
注意:dip与屏幕密度有关,屏幕密度与硬件有关,硬件设置不正确,有可能导致dip不能正常显示。在屏幕密度为160的显示屏上,1dip=1px
下面是一些分辨率信息
名称分辨率屏幕密度QVGA320*240120WQVGA400400*240120WQVGA432432*240120HVGA640*480160WSVGA1024*600160WXGA8001280*800160WVGA800800*480240WVGA854854*480240WXGA7201280*720320
下面没有特殊说明的话,屏幕的宽度都指其像素数
我们在手机A上面放了一张图片,120px宽,手机屏幕240px宽,也就是说图片的宽度占了整个屏幕的一半
如果把应用安装在手机B上,B的宽度=320px,那么我们希望图片宽度为多少呢?如果大家希望按着比例缩放,那图片宽度应该是160px,占屏幕宽度的50%
如果我们在xml中使用的单位为dp,下面看看如何保持这个比例:
px = (density/160)dp(density这里是(*)的意思)
我们把所期待的比例记为rate,baseDensity=160,屏幕的宽度(像素数)为x,屏幕密度为density
那么rate=((density/baseDensity)*dp)/x;
这里baseDensity是已知的=160,dp也是已知的,因为是你写的嘛。
未知的是density屏幕密度和屏幕宽度x
rate可以写为:
rate=(dp/baseDensity)*(density/x);
现在情况就比较明朗了,rate=K(常数)*(density/x);
如果想保持rate不变,那么需要保证density/x保持比例
给数学不好的同学多解释两句
想保持rate的话,必须要手机A的屏幕密度/屏幕宽度=手机B的屏幕密度/屏幕宽度
或者说手机A的屏幕密度/手机B的屏幕密度=手机A的屏幕宽度/手机B的屏幕宽度
同样,如果你要保持纵向也保持等比缩放,那么也同样需要保持比例。
只有这样,你的应用才能看上去是等比缩放的。
使用dp保持比例只和这些有关,和你屏幕大小半点关系都没有。
还有另一种方式来保持比例:就是直接使用比例方式定义组件大小
但是很有局限性,只有LinearLayout中可以使用android:layout_weight属性
其实很容易理解,给大家举个例子
很多人觉得,如果项目中全部使用dp,那么就可以完美移植。
我们的一个移植项目,任务是把应用从A(分辨率为WXGA720=1280*720)移植到B(分辨率WVGA800=800*480)
其中A的密度=320,B的密度为240
我们现在来看看A横向有多少个dp
A dp数=720/(320/160)=360
B dp数=480/(240/160)=320
手机A横向有360个dp,如果你的图片占用360个dp,B去哪找你多出来的40dp呢!必然它会显示在屏幕外面阿!
ps:下面是一点相关内容
下面是函数void android.util.DisplayMetrics.setToDefaults() 其中density变量注释如下
density变量注释 写道 粗略的翻译了一下:
- android 分辨率适配与dip(dp)的使用
- android 分辨率适配与dip(dp)的使用
- android 分辨率适配与dip(dp)的使用
- android 分辨率适配与dip(dp)的使用
- android 分辨率适配与dip(dp)的使用
- android 项目移植/分辨率适配与dip(dp)的使用
- android 项目移植/分辨率适配与dip(dp)的使用
- android 项目移植/分辨率适配与dip(dp)的使用
- android 项目移植/分辨率适配与dip(dp)的使用
- android 项目移植/分辨率适配与dip(dp)的使用
- android 项目移植/分辨率适配与dip(dp)的使用
- 【Android】手机屏幕分辨率与dip、dp、sp的区别
- 安卓手机屏幕分辨率与dip、dp、sp的区别
- Android分辨率中dip, dp, px, sp之间的区别
- dip, dp, px, sp的区别————(Android分辨率_01)
- android px与dp(dip)的转换
- 分辨率像素android手机屏幕分辨率 及 sp dip(dp) px 区别 及高中低分辨率时处理
- dp(dip)与sp的区别
- 服务器IP冲突 数据库无法连接
- JAVA--编写一个JFrame,标题为“计算的窗口”,在该窗口中组件的布局是FlowLayout。窗口中添加两个文本区,当我们在一个文本区中输入若干个数时,另一个文本区同时对输入的数进行求和运算并求
- oracle 回收站管理
- UITableView可编辑状态常用操作
- UITableViewCell编辑修改整体frame
- android 分辨率适配与dip(dp)的使用
- PHP基础常用正则表达式
- Skinny triangle
- Java的静态块、模块、构造方法的执行顺序
- 【OpenCV学习】图像的形态处理学
- Linux驱动之与硬件通信
- Java--封装一类对象,功能是随机产生一个2000年后的年份,并输出该年2月的日历页,需处理闰年的问题。
- 输出1/3-3/5+5/7-7/9......+19/21的结果
- LNK2019: 无法解析的外部符号 "wchar_t * __stdcall _com_util::ConvertStringToBSTR(char const *)"解决方案