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

一、获取屏幕宽高

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);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容