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

来源:互联网 发布:lcd1602与单片机连接图 编辑:程序博客网 时间:2024/04/27 01:23

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=120density 值表示每英寸有多少个显示点,与分辨率是两个概念。 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); }  }
1 0
原创粉丝点击