android之单位


Android设备种类多样,要想适配好各种屏幕,理解各种屏幕数据是必须的。首先先从DisplayMetircs类聊起,DisplayMetircs类可以很方便的获取屏幕相关的信息,使用方法如下:

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

 

下面解释下DisplayMetircs类里的属性:

widthPixels、heightPixels这两个属性就是屏幕宽和高的绝对像素,比如:1280,800。
xdpi、ydpidpi(density independent pixel)这两个属性是对应X轴和Y轴的,每英寸像素数,比如一个像素为240x320,大小为1.5"x2"的屏幕,其xdpi=240/1.5=160,ydpi=320/2=160。注意这个值不一定是整数。
densityDpi 这个值不是精确值,他只代表了屏幕dpi的基准,常用的取值为120、160、240、320等。这个属性对应/layout-ldpi、/layout-mdpi、/layout-hdpi等自动适配的布局文件。
 density 真实dpi(对角线的像素/对角线的英寸)与基准dpi(160)的比值,比如:一个320x480,大小为1.5"x2"的屏幕,其density=240/160=1.5。这个值是给单位dip和单位px换算用的,dip=density*px,后面会详细说明。
 scaledDensity这个值与density一样, 但在运行中会根据用户设置的系统字体大小来动态调整。

 

 

 

 

 

 

 

 

 

 

 

 

 

 



了解了这些基础知识后,各种单位就好理解了:

px (pixels,像素)顾名思义,实际的像素点数。像素的缺点很明显,Android设备的像素种类很多,如果一个控件的像素为320x320,那么在240x320的屏幕中显示将不完整,所以我们要为每一种屏幕像素配置一种大小,这显然不现实,所以google不推荐使用这个单位。
pt (point,磅)1pt=1/72英寸,一般用作字体单位,这个同px,都是无法动态调整的单位,不推荐。
dip (Density Independent Pixel,密度无关像素,也可写dp)为了解决多种像素适配的问题,android引入了dip单位,这个单位的换算公式为:dip/pixels=屏幕dpi/160,而density=屏幕dpi/160,所以dip = density*pixels,也就是说,如果屏幕为240x320,1.5"x2"尺寸,则其dpi为160,density=1,那么一个dip相当与一个px;如果屏幕像素增加到480x800,尺寸不变,那么其dpi为320,density=2,则一个dip相当与两个px,这样就达到了缩放的目的。
 sp (scaled pixels,缩放像素) 类似dip,同样是动态调整的,不过是依据屏幕密度density和用户设置的系统字体大小来调整的,所以sp使用于设置字体的大小。
 mm (millimeters,毫米) 普通长度单位,基于屏幕的实际尺寸。

 in (inches,英  寸)        

 普通长度单位,基于屏幕的实际尺寸





 
















 /**
   * dip转换px
   *
   * @param context 上下文
   * @param dpValue dip值
   * @return px值
   */
  public static int dip2px(Context context, float dpValue) {
    final float scale = context.getResources().getDisplayMetrics().density;
    return (int) (dpValue * scale + 0.5f);
  }

  /**
   * sp转pd
   *
   * @param context 上下文
   * @param spValue sp值
   * @return px值
   */
  public static int sp2px(Context context, float spValue) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, spValue,
        context.getResources().getDisplayMetrics());
  }

  /**
   * px转换dip
   *
   * @param context 上下文
   * @param pxValue px值
   * @return dip值
   */
  public static int px2dip(Context context, float pxValue) {
    final float scale = context.getResources().getDisplayMetrics().density;
    return (int) (pxValue / scale + 0.5f);
  }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值