android dp dip中dip,dp,sp,pt和px的区别

关于android 中的长度单位 px,dp,dip,pt,sp
[问题点数:50分,结帖人laorer]
关于android 中的长度单位 px,dp,dip,pt,sp
[问题点数:50分,结帖人laorer]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2010年9月 移动平台大版内专家分月排行榜第二
2010年12月 移动平台大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。当前访客身份:游客 [
当前位置:
今天碰到的一个问题,感觉应该其他人也会碰到,拿来分享一下。
我们都知道android在开发配置界面时一般都会使用dip和sp这种逻辑长度单位来实现屏幕无关,我也正是这么做的,今天用同事的I9300跑了一下我写的demo,发现”不对啊“,我自己的手机显示没问题啊,但在9300中出现了问题。主要就是一些按钮的背景是.9.png,其中文本是充满整个可填充区域的,结果在9300里面文字过大只能显示一部分。我反正郁闷了好一会,分析了一下可能原因最终锁定在dip和sp的使用上。在android内部会使用TypedValue.applyDimension函数将所有单位换算成px,代码如下:
public static float applyDimension(int unit, float value,
DisplayMetrics metrics)
switch (unit) {
case COMPLEX_UNIT_PX:
case COMPLEX_UNIT_DIP:
return value * metrics.
case COMPLEX_UNIT_SP:
return value * metrics.scaledD
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
观察dip和sp的换算,主要就是density和scaledDensity的区别,这两个值和手机屏幕本身参数有关,我在程序中使用&Resources.getSystem().getDisplayMetrics()得到当前系统屏幕相关的参数并打印出来结果就很显然了,我的手机两个值都是1.5(ps:我试了几款手机,这两个值都是相等的),而I9300中density=2.0,scaledDensity=2.6,这就知道前面现象的原因了,sp的换算比率比dip大,造成了字体的增幅超出按钮bg的增幅,于是文本就显示不下了。解决这个问题也很简单,只要在将android:textSize属性的单位有sp改成dip就行了。
虽然google推荐使用sp作为 android:textSize&属性的单位,但实际情况下,还是有可能出现问题:D
---------------话题补充---------------
:I9300确实有字体大小的设置选项,而且我同事的手机确实已经设置得比正常大一号(并不是所有手机都有该设置选项),为了界面布局的一致,像”按钮“之类的控件布局时还是使用dip做单位保险一点。
共有6个评论
<span class="a_vote_num" id="a_vote_num_
scaledDensity 默认情况和& density 是相等的,如果用户设置了字体大小偏好,则可能不同。
是不是你同事的9300设置了字体大小偏大呢?
在&设置-显示-字体大小 可以查看设置情况
<span class="a_vote_num" id="a_vote_num_
引用来自“yinjq”的答案scaledDensity 默认情况和& density 是相等的,如果用户设置了字体大小偏好,则可能不同。
是不是你同事的9300设置了字体大小偏大呢?
在&设置-显示-字体大小 可以查看设置情况但是这也是一个潜在的问题,我们的应用不能说用户更改了系统设置就出现布局和预期不想同的情况
<span class="a_vote_num" id="a_vote_num_
我也有时候感觉使用dp比sp好
<span class="a_vote_num" id="a_vote_num_
嗯,你说的也是一个问题,但是设计的时候为什么让按钮上的字填满整个区域呢?如果你那按钮的背景不是做成.9的,应该不会有这个问题的。
<span class="a_vote_num" id="a_vote_num_
引用来自“yinjq”的答案嗯,你说的也是一个问题,但是设计的时候为什么让按钮上的字填满整个区域呢?如果你那按钮的背景不是做成.9的,应该不会有这个问题的。按钮本身设计的比较小,然后4个圆角在做.9.png的时候直接当做padding区域的,因此实际显示文本的空间已经很小了,才会把字体设置的尽可能的大
<span class="a_vote_num" id="a_vote_num_
请教一下, 我现在在布局中将所所有的单位换成了dip, 包括布局中的marginTop, left, right, 但是在不同分辨率下测试依然没有任何变化(在真机上测试的, 有4.0, 4.3, 4.7, 7.0寸), 是不是还需要在其他地方设置些什么呢? 请速答
--- 共有 3 条评论 ---
: 你把这个布局文件贴出来,布局这种受影响因素还是比较多的
(3年前)&nbsp&
就是并没有根据分辨率的大小来适应, 比如我在4寸下设置的margin-top=10dip, 在我切换到7寸下时, margin-top并没有变化, 还是出现错位了.
(3年前)&nbsp&
从你说的这些内容无法得出原因啊
(3年前)&nbsp&
有什么技术问题吗?
soso_fy...的其他问题
类似的话题【转】Android的计量单位px,in,mm,pt,dp,dip,sp - 向前进 - ITeye技术网站
博客分类:
Historically, programmers always designed computer interfaces in terms of pixels. For example, you mightmake a field 300 pixels wide, allow 5 pixels of spacing between columns, and define icons 16-by-16 pixels in size. The problem is that if you run that program on new displays with more and more dots per inch (dpi), the user interface appears smaller and smaller. At some point, it becomes too hard to read. Resolution-independent measurements help solve this problem.Android supports all the following units:o px (pixels): Dots on the screen.o in (inches): Size as measured by a ruler.o mm (millimeters): Size as measured by a ruler.o pt (points): 1/72 of an inch.o dp (density-independent pixels): An abstract unit based on the density of the screen. On a display with 160 dots per inch, 1dp = 1px.o dip: Synonym for dp, used more often in Google examples.o sp (scale-independent pixels): Similar to dp but also scaled by the user’s font size preference.To make your interface scalable to any current and future type of display, I recommend you always use the sp unit for text sizes and the dip unit for everything else. You should also consider using vector graphics instead of bitmaps
如果英文不想看,看下面:
px:是屏幕的像素点
pt:磅,1/72 英寸
dp:一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1px
dip:等同于dp
sp:同dp相似,但还会根据用户的字体大小偏好来缩放。
建议使用sp作为文本的单位,其它用dip
针对dip和px 的关系,做以下概述:
HVGA屏density=160;QVGA屏density=120;WVGA屏density=240;WQVGA屏density=120density值表示每英寸有多少个显示点,与分辨率是两个概念。不同density下分辨率信息,以480dip*800dip的 WVGA(density=240)为例density=120时 屏幕实际分辨率为240px*400px (两个点对应一个分辨率)栏和标题栏高各19px或者25dip 横屏是屏幕宽度400px 或者800dip,工作区域高度211px或者480dip竖屏时屏幕宽度240px或者480dip,工作区域高度381px或者775dipdensity=160时 屏幕实际分辨率为320px*533px (3个点对应两个分辨率)状态栏和标题栏高个25px或者25dip 横屏是屏幕宽度533px 或者800dip,工作区域高度295px或者480dip竖屏时屏幕宽度320px或者480dip,工作区域高度508px或者775dipdensity=240时 屏幕实际分辨率为480px*800px (一个点对于一个分辨率)状态栏和标题栏高个38px或者25dip 横屏是屏幕宽度800px 或者800dip,工作区域高度442px或者480dip竖屏时屏幕宽度480px或者480dip,工作区域高度762px或者775dipapk的包中,当屏幕density=240时使用hdpi 标签的资源当屏幕density=160时,使用mdpi标签的资源当屏幕density=120时,使用ldpi标签的资源。不加任何标签的资源是各种分辨率情况下共用的。布局时尽量使用单位dip,少使用px
浏览: 13203 次
来自: 上海Android 中dp 和px 转换及原理分析 - 北极光之吻 - ITeye技术网站
博客分类:
具体的转换方法如下,网上都是有的,但是自己看了之后感觉还是有点不明不白的,具体为什么呢,可以继续看后面.
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().
return (int) (dpValue * scale + 0.5f);
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().
return (int) (pxValue / scale + 0.5f);
首先先列出来相关的方法:
Resources.java
public Resources(AssetManager assets, DisplayMetrics metrics,
Configuration config, CompatibilityInfo compInfo) {
mMetrics.setToDefaults();
mCompatibilityInfo = compI
updateConfiguration(config, metrics);
assets.ensureStringBlocks();
DisplayMetrics.java 相关方法
public void setToDefaults() {
widthPixels = 0;
heightPixels = 0;
DENSITY_DEVICE / (float) DENSITY_DEFAULT;
densityDpi =
DENSITY_DEVICE;
scaledDensity =
xdpi = DENSITY_DEVICE;
ydpi = DENSITY_DEVICE;
noncompatWidthPixels = widthP
noncompatHeightPixels = heightP
noncompatDensity =
noncompatDensityDpi = densityD
noncompatScaledDensity = scaledD
noncompatXdpi =
noncompatYdpi =
public static int DENSITY_DEVICE = getDeviceDensity();
private static int getDeviceDensity() {
// qemu.sf.lcd_density can be used to override ro.sf.lcd_density
// when running in the emulator, allowing for dynamic configurations.
// The reason for this is that ro.sf.lcd_density is write-once and is
// set by the init process when it parses build.prop before anything else.
return SystemProperties.getInt("qemu.sf.lcd_density",
SystemProperties.getInt("ro.sf.lcd_density", DENSITY_DEFAULT));
* The reference density used throughout the system.
public static final int DENSITY_DEFAULT = DENSITY_MEDIUM;
* Standard quantized DPI for medium-density screens.
public static final int DENSITY_MEDIUM = 160;
在 Resources.java 的构造函数里面调用DisplayMetrics 的setToDefaults 方法,使density 取值为DENSITY_DEVICE / (float) DENSITY_DEFAULT;
使density 最终的值和key:qemu.sf.lcd_density 和default_value:ro.sf.lcd_density 有关系,
系统里面一般并没有额外对key:qemu.sf.lcd_density 赋值,故取值ro.sf.lcd_density,而ro.sf.lcd_density 的值一般是在系统源码里面的设置好的了,比如:system.prop 里面可以设置该值.
北极光之吻
浏览: 234933 次
来自: 深圳
repo sync 下载耗时太久了, 有没有国内的站可下编译环 ...
kslinabc 写道请问楼主,4.4下载下来有多大,为啥我这 ...
求大神帮个忙好吗?我需要android4.3之后版本编译生成文 ...
请问楼主,4.4下载下来有多大,为啥我这个40多个G了还没下载 ...
eyeandroid 写道我的:repo 1.12.13gpg ...android px与dp(dip)的转换-android100学习网
android px与dp(dip)的转换
方法一:Resources resources = getResources();float fPx = TypedValue.
Resources resources = getResources();
float fPx = TypedValue.PLEX_UNIT_DIP, 300, resources.getDisplayMetrics());
//int iPx = Math.round(fPx);
// 同理 px转dip:
float fDip = TypedValue.PLEX_UNIT_PX, 300, resources.getDisplayMetrics());
// int iDip = Math.round(fDip);
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
public static int dip2px(Context context, float dpValue)
final float scale = context.getResources().getDisplayMetrics().
return (int) ((dpValue * scale) + 0.5f);
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
public static int px2dip(Context context, float pxValue)
final float scale = context.getResources().getDisplayMetrics().
return (int) ((pxValue / scale) + 0.5f);}

我要回帖

更多关于 android dp dip 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信