您的位置:首页 > 移动开发 > Android开发

Android下的单位及相互之间的关系和换算

2016-12-15 23:36 429 查看

dip(简称dp)

一个基于 density(密度)的抽象单位,这个和设备硬件有关,通常在开发中设置一
些 view 的宽高推荐用这个,一般情况下,在不同分辨率,都不会有缩放的感觉。在运
行时, Android 根据使用中的屏幕的实际密度, 透明地处理任何所需 dip 单位的缩放。
不依赖设备像素,依据设备自动适应大小,推荐使用


sp

同 dip/dp 相似,会根据用户的字体大小偏好来缩放,专门用于设置字体的大小。


总结:在设置中,控件的高低大小使用的dp,不依赖设备的像素,根据设备自动适应大小。而,设置字体的大小要使用sp,可一个根据用户字体的大小进行缩放。

px

像素,是屏幕的物理像素点,与密度相关,密度大了,单位面积上的 px 会比较多。
在不同分辨率下会有不同的效果,通常不推荐使用这个,用dp进行替代;


dp与px之间的关系

首先明确一点:
HVGA 屏 density=160;QVGA 屏 density=120;
WVGA 屏 density=240;WQVGA 屏 density=120
density 值表示每英寸有多少个显示点,与分辨率是两个概念。
dip 到 px 的转换公式: px = dip * (density / 160)
Android 官方定义 dip 等价于 160dpi 屏幕下的一个物理像素点, 即 1dip=1px。举例来
说, 在 240 dpi 的屏幕上, 1dip 等于 1.5px。
不同 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 在不同分辨率时,是否支持多密度的方法

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="FrameLayout"
android:versionCode="1"
android:versionName="1.0" >
--------
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true" />
-------
</manifest>


下面是dp与px的换算工具

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: