美文网首页
获取屏幕信息及DP、SP、PX的转换

获取屏幕信息及DP、SP、PX的转换

作者: zizi192 | 来源:发表于2017-11-06 14:25 被阅读0次

一、获取屏幕宽高

android获取屏幕的高度和宽度用到WindowManager这个类,两种方法:

//获取windowmanager
WindowManager wm = (WindowManager) getContext()
                    .getSystemService(Context.WINDOW_SERVICE);
WindowManager wm = this.getWindowManager();
 
//第一种
int width = wm.getDefaultDisplay().getWidth();
int height = wm.getDefaultDisplay().getHeight();

//第二种。第一种方法的getWidth已deprecated,改用getSize方法
Point point = new Point();
wm.getDefaultDisplay().getSize(point);
int width =  point.x;
int height = point.y;

//第三种。常用方法
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels;
int height = dm.heightPixels;

//第四种
DisplayMetrics dm = getResources().getDisplayMetrics();
int width = dm.widthPixels;
int height= dm.heightPixels;

DP与PX的转换

public static int pxToDp(Context context, float pxValue) {    
     if (context == null) {
         return -1;
     }

     final float scale = context.getResources().getDisplayMetrics().density;    
     return (int) (pxValue / scale + 0.5f);    
}    
      
public static int dpToPx(Context context, float dipValue) {    
     if (context == null) {
         return -1;
     }

     final float scale = context.getResources().getDisplayMetrics().density;    
     return (int) (dipValue * scale + 0.5f);    
}  

根据google的开发文档,理论上dip=pxValue/scale和px=dipValue*scale。但是scale是浮点值,最终程序中需要的一般是int值。java程序的类型转换有精度问题,其中4.1f和4.9f强制转换为int时,值都为4。为了实现常规的四舍五入,这里 加上0.5f来保证强制转换的精度

在现实中还看到另一种实现方式,其中Resources.getSystem() 可以在任何地方进行调用,但是只能获取系统本身的资源。Math.round则实现了float强制转换int时四舍五入的算法。

private static final float  DENSITY = Resources.getSystem().getDisplayMetrics().density;

public static int dp2Px(int dp) {
        return Math.round(dp * DENSITY);
}

SP与PX的转换

public static int pxToSp(Context context, float pxValue) {
     if (context == null) {
         return -1;
     }

     final float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity;    
     return (int)(pxValue / scaledDensity + 0.5f);
}

    /**
     * 将sp值转换为px值,保证文字大小不变
     *
     * @param spValue sp值
     * @return context为null,返回-1,否则返回计算后的值
     */
public static int spToPx(Context context, float spValue) {
     if (context == null) {
         return -1;
     }

     final float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity;    
     return (int)(spValue * scaledDensity + 0.5f);
}

相关文章

网友评论

      本文标题:获取屏幕信息及DP、SP、PX的转换

      本文链接:https://www.haomeiwen.com/subject/fnivkxtx.html