Android的疑问-px,dp和sp,这些单位有什么区别

时间:2021-06-17 12:08:13   收藏:0   阅读:14

1、px

  即像素,1px代表屏幕上的一个物理像素点。

2、dp

  dip:device independent pixels(设备独立像素),dp与dip一样,不同的设备有不同的显示效果,一般为了支持WVGA、HVGA和QVGA推荐使用这个,不依赖像素。

3、sp

  sp:scale-independent pixels(缩放独立像素),与缩放无关的抽象像素,它和dp很相似,但唯一的区别在于,Android系统允许用户自定义文字尺寸大小(小,正常,大,超大等),当文字尺寸是“正常”时,1sp=1dp=0.00625inch(英寸),当文字尺寸是“大”或“超大”时,1sp>1dp=0.00625inch

4、dpi

  dpi:dots per inch(每英寸点数,或者说每英寸像素数目 更易懂),由设备决定,是写死的,可以通过context.getResources().getDisplayMetrics().densityDpi获取到。当然,也可以通过以下方法算出:

  dpi=横向分辨率/横向英寸数=纵向分辨率/纵向英寸数

Google 规定的屏幕密度列表:

__________________________________________________________________________________

dp与px

px=dp*(dpi/160)

dp=px/(dpi/160)

sp与px

px=sp*(dpi/160)

sp=px/(dpi/160)

 

_____________________________________________________________________________

获取DisplayMetrics对象方法:

DisplayMetrics dm=new DisplayMetrics();
//获得DisplayMetrics对象方法一
//dm=context.getResources().getDisplayMetrics();
//获得DisplayMetrics对象方法二
((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(dm);

px转其他单位代码:(该方法来自TypedValue)

技术分享图片
public static float applyDimension(int unit, float value,
   DisplayMetrics metrics)
   {
 switch (unit) {
 case COMPLEX_UNIT_PX:
     return value;
 case COMPLEX_UNIT_DIP:
     return value * metrics.density;
 case COMPLEX_UNIT_SP:
     return value * metrics.scaledDensity;
 case COMPLEX_UNIT_PT:
     return value * metrics.xdpi * (1.0f/72);
 case COMPLEX_UNIT_IN:
     return value * metrics.xdpi;
 case COMPLEX_UNIT_MM:
     return value * metrics.xdpi * (1.0f/25.4f);
 }
 return 0;
    }
技术分享图片

 另外一种px转dp的代码:

技术分享图片
/** 
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp 
     */  
    public static int px2dip(Context context, float pxValue) {  
        final float scale = context.getResources().getDisplayMetrics().density;  
        return (int) (pxValue / scale + 0.5f);  
    }
技术分享图片

dp转px:

技术分享图片
/** 
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素) 
     */  
    public static int dip2px(Context context, float dpValue) {  
        final float scale = context.getResources().getDisplayMetrics().density;  
        return (int) (dpValue * scale + 0.5f);  
    } 
技术分享图片

 

 

引用自https://www.cnblogs.com/libertycode/p/5247421.html

原文:https://www.cnblogs.com/zhanghua-lijie/p/14891958.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!