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

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);
 }
  }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值