android中dip、px相互换算
2016-07-25 02:29
441 查看
http://blog.csdn.net/shen332401890/article/details/8812555
感觉这篇文章特别棒,解决了我很多疑惑,让我对dip和px概念以及两者之间如何换算有了更深入的理解,保留下来供以后阅读。但还是有一个疑问:为什么要引入dip?或者说dip存在的意义是什么?
补充
学习Android这么久,马上毕业要参加工作了,一直对px、dip、sp、dp这几个单位概念似懂非懂的,这次因为工作上的需要,网上搜了点资料并整理了下,写篇日志以便以后阅读。
1.px (pixels)(像素):是屏幕的物理像素点,与密度相关,密度大了,单位面积上的px会比较多。通常不推荐使用这个。
2.dip或dp(与密度无关的像素):一个基于density的抽象单位,这个和设备硬件有关,通常在开发中设置一些view的宽高推荐用这个,一般情况下,在不同分辨率,都不会有缩放的感觉。在运行时,
Android根据使用中的屏幕的实际密度, 透明地处理任何所需dip单位的缩放。
3.sp(与刻度无关的像素):同dip/dp相似,会根据用户的字体大小偏好来缩放,主要用于设置字体的大小。
可能很多朋友对dip和px 的区别,不是很清楚,包括我自己之前都没弄清楚,下面简单讨论一下:
首先明确一点:
HVGA屏density=160;QVGA屏density=120;
WVGA屏density=240;WQVGA屏density=120
density值表示每英寸有多少个显示点,与分辨率是两个概念。
dip到px的转换公式: px
= dip * (density / 160) 但代码可不是怎么写的,如何写?参照http://blog.csdn.net/u010477502/article/details/52093827
Android官方定义dip等价于160dpi屏幕下的一个物理像素点,
即1dip=1px。举例来说, 在 240
dpi 的屏幕上, 1dip 等于 1.5px。px
= 1 * (240 / 160)= 1.5
不同density下屏幕分辨率信息,以480dip*800dip的 WVGA(density=240)为例:
1.当density=120时屏幕实际分辨率为240px*400px (两个点对应一个分辨率)状态栏和标题栏高为19px或者25dip。
横屏时屏幕宽度为400px或者800dip,工作区域高度211px或者455dip;
竖屏时屏幕宽度为240px或者480dip,工作区域高度381px或者775dip。
2.当density=160时屏幕实际分辨率为320px*533px (3个点对应两个分辨率)状态栏和标题栏高为25px或者25dip。
横屏是屏幕宽度533px 或者800dip,工作区域高度295px或者455dip;
竖屏时屏幕宽度320px或者480dip,工作区域高度508px或者775dip。
3.当density=240时屏幕实际分辨率为480px*800px (一个点对于一个分辨率)状态栏和标题栏高为38px或者25dip。
横屏是屏幕宽度800px 或者800dip,工作区域高度442px或者455dip;
竖屏时屏幕宽度480px或者480dip,工作区域高度762px或者775dip。
在Android的应用包apk中,系统会根据各个设备的具体情况引用相应的资源文件(注:不加任何标签的资源是各种分辨率情况下共用的):
当屏幕density=240时,使用hdpi标签的资源;
当屏幕density=160时,使用mdpi标签的资源;
当屏幕density=120时,使用ldpi标签的资源。
下面是在manifest中设置app在不同分辨率时,是否支持多密度的方法。
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
...
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true" />
...
</manifest>
附:
系统对屏幕大小和密度分类对照图 :
表 1. Android SDK中包含的模拟器皮肤的屏幕尺寸和密度,以及其他典型的分辨率.
* 要模拟此配置, 使用WVGA800 或 WVGA854创建一个AVD, 指定自定义密度160.
** 要模拟此配置, 使用WVGA800 或 WVGA854创建一个AVD, 指定自定义密度120.
辅助工具类:
import android.content.Context;
public class DensityUtil {
public static int dip2px(Context context, float dipValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}
转自http://my.oschina.net/xiangmao/blog/51570
感觉这篇文章特别棒,解决了我很多疑惑,让我对dip和px概念以及两者之间如何换算有了更深入的理解,保留下来供以后阅读。但还是有一个疑问:为什么要引入dip?或者说dip存在的意义是什么?
1. dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,
一般我们为了支持WVGA、HVGA和QVGA 推荐使用这 这个,不依赖像素。 这里要特别注意dip与屏幕密度有关,而屏幕密度又与具体的硬件有关,硬件设置不正确,有可能导致dip不能正常显示。
在屏幕密度为160的显示屏上,1dip=1px,有时候可能你的屏幕分辨率很大如480*800,
但是屏幕密度没有正确设置比如说还是160,
那么这个时候凡是使用dip的都会显示异常,基本都是显示过小。 dip的换算: dip(value)=(int) (px(value)/1.5 + 0.5) 2. dp: 很简单,和dip是一样的。 3. px: pixels(像素),不同的设备不同的显示屏显示效果是相同的,这是绝对像素,是多少就永远是多少不会改变。 4. sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。 备注: 根据google的推荐,像素统一使用dip,字体统一使用sp 举个例子区别px和dip: px就是像素,如果用px,就会用实际像素画,比个如吧,用画一条长度为240px的横线,在480宽的模拟器上看就是一半的屏宽,
而在320宽的模拟器上看就是2/3的屏宽了。 而dip,就是把屏幕的高分成480分,宽分成320分。比如你做一条160dip的横线,无论你在320还480的模拟器上,
都是一半屏的长度。public static int dip2px(Context context, float dipValue){ final float scale = context.getResources().getDisplayMetrics().density; return (int)(dipValue * scale + 0.5f); } public static int px2dip(Context context, float pxValue){ final float scale = context.getResources().getDisplayMetrics().density; return (int)(pxValue / scale + 0.5f); }
补充
学习Android这么久,马上毕业要参加工作了,一直对px、dip、sp、dp这几个单位概念似懂非懂的,这次因为工作上的需要,网上搜了点资料并整理了下,写篇日志以便以后阅读。
1.px (pixels)(像素):是屏幕的物理像素点,与密度相关,密度大了,单位面积上的px会比较多。通常不推荐使用这个。
2.dip或dp(与密度无关的像素):一个基于density的抽象单位,这个和设备硬件有关,通常在开发中设置一些view的宽高推荐用这个,一般情况下,在不同分辨率,都不会有缩放的感觉。在运行时,
Android根据使用中的屏幕的实际密度, 透明地处理任何所需dip单位的缩放。
3.sp(与刻度无关的像素):同dip/dp相似,会根据用户的字体大小偏好来缩放,主要用于设置字体的大小。
可能很多朋友对dip和px 的区别,不是很清楚,包括我自己之前都没弄清楚,下面简单讨论一下:
首先明确一点:
HVGA屏density=160;QVGA屏density=120;
WVGA屏density=240;WQVGA屏density=120
density值表示每英寸有多少个显示点,与分辨率是两个概念。
dip到px的转换公式: px
= dip * (density / 160) 但代码可不是怎么写的,如何写?参照http://blog.csdn.net/u010477502/article/details/52093827
Android官方定义dip等价于160dpi屏幕下的一个物理像素点,
即1dip=1px。举例来说, 在 240
dpi 的屏幕上, 1dip 等于 1.5px。px
= 1 * (240 / 160)= 1.5
不同density下屏幕分辨率信息,以480dip*800dip的 WVGA(density=240)为例:
1.当density=120时屏幕实际分辨率为240px*400px (两个点对应一个分辨率)状态栏和标题栏高为19px或者25dip。
横屏时屏幕宽度为400px或者800dip,工作区域高度211px或者455dip;
竖屏时屏幕宽度为240px或者480dip,工作区域高度381px或者775dip。
2.当density=160时屏幕实际分辨率为320px*533px (3个点对应两个分辨率)状态栏和标题栏高为25px或者25dip。
横屏是屏幕宽度533px 或者800dip,工作区域高度295px或者455dip;
竖屏时屏幕宽度320px或者480dip,工作区域高度508px或者775dip。
3.当density=240时屏幕实际分辨率为480px*800px (一个点对于一个分辨率)状态栏和标题栏高为38px或者25dip。
横屏是屏幕宽度800px 或者800dip,工作区域高度442px或者455dip;
竖屏时屏幕宽度480px或者480dip,工作区域高度762px或者775dip。
在Android的应用包apk中,系统会根据各个设备的具体情况引用相应的资源文件(注:不加任何标签的资源是各种分辨率情况下共用的):
当屏幕density=240时,使用hdpi标签的资源;
当屏幕density=160时,使用mdpi标签的资源;
当屏幕density=120时,使用ldpi标签的资源。
下面是在manifest中设置app在不同分辨率时,是否支持多密度的方法。
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
...
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true" />
...
</manifest>
附:
系统对屏幕大小和密度分类对照图 :
表 1. Android SDK中包含的模拟器皮肤的屏幕尺寸和密度,以及其他典型的分辨率.
Low density (120), ldpi | Medium density (160), mdpi | High density (240), hdpi | Extra high density (320), xhdpi | |
---|---|---|---|---|
Small screen | QVGA (240x320) | 480x640 | ||
Normal screen | WQVGA400 (240x400) WQVGA432 (240x432) | HVGA (320x480) | WVGA800 (480x800) WVGA854 (480x854) 600x1024 | 640x960 |
Large screen | WVGA800** (480x800) WVGA854** (480x854) | WVGA800* (480x800) WVGA854* (480x854) 600x1024 | ||
Extra Large screen | 1024x600 | WXGA (1280x800)† 1024x768 1280x768 | 1536x1152 1920x1152 1920x1200 | 2048x1536 2560x1536 2560x1600 |
** 要模拟此配置, 使用WVGA800 或 WVGA854创建一个AVD, 指定自定义密度120.
辅助工具类:
import android.content.Context;
public class DensityUtil {
public static int dip2px(Context context, float dipValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}
转自http://my.oschina.net/xiangmao/blog/51570
相关文章推荐
- android的一些知识小记
- Android一行命令上传你的项目到Jcenter/Maven
- Android SQLiteDatabase的使用
- android应用启动,卸载,分享应用
- android测试类
- 【Android】创建Popwindow弹出菜单的两种方式
- Android强制设置横屏或竖屏 切换的问题
- 如何在Android中取得当前进程名
- Chromium分发输入事件给WebKit处理的过程分析
- Gradle minifyEnabled 使用proguard混淆android代码 android studio 打jar包并混淆
- 当下流行播放器,实现图片动态旋转
- Android-开发笔记-002_Android的灵魂
- Android 将照片存入相册中之后相册不显示该照片
- 图解spinner用法
- ListView常用优化技巧(Android群英传)
- Android 启动的四种模式分析+图
- Android下拉刷新控件SwipeRefreshLayout源码浅析
- Android 中构建快速可靠的 UI 测试
- Android对应关系——版本、源码和API Level对应关系
- Android权限——中英文对照表