android获取屏幕分辨率的正确方法;获取到分辨率(垂直方向像素)的不正确;heightPixels值不正确
最近由于工作需要,我想通过程序显示android设备的屏幕分辨率,然后我就去网上找了一圈,通过整理得到以下三种获取屏幕分辨率的方法:
第一种方法:
public static String getDeviceResolution1(Context context){
DisplayMetrics dm=context.getResources().getDisplayMetrics();
return dm.widthPixels+"x"+dm.heightPixels;
}
第二种方法:
public static String getDeviceResolution2(Context context){
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm=new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
return dm.widthPixels+"x"+dm.heightPixels;
}
这两种方法效果相同,获取到的值如下:
它们获取到的值都是1600x2092 不过后面我通过命令获取了设备的屏幕分辨率值,结果却不太一样:
PS:命令在这adb shell wm size
通过命令获取到的屏幕分辨率是1600x2176,很明显垂直方向像素个数(像素高度)不对,也就是说dm.heightPixels获取到的值不对,这是为什么呢?
原来 dm.heightPixels在获取的像素高度值时将状态栏的高度去掉了!因为过去的Androids设备将获取到的 heightPixels 值减去状态栏的高度就是可用高度,也就是说这个值不是真正的像素高度
所以,为了能获取到真正的像素高度,我找到了下面这种方法,
第三种方法:
public static String getDeviceResolution3(Activity activity){
final View decorView = activity.getWindow().getDecorView();
return decorView.getWidth()+"x"+decorView.getHeight();
}
不过这种方法需要延迟(或刷新一次),才能获取到值,所以需要在Activity添加以下代码(当然如果你有更好的方法,请忽略):
private Timer timer=new Timer();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_activity);
Log.d("FirstActivity","方法1获取到的分辨率:"+Test.getDeviceResolution1(this));
Log.d("FirstActivity","方法2获取到的分辨率:"+Test.getDeviceResolution2(this));
timer.schedule(new TimerTask() {
@Override
public void run() {
showLog3();
}
},300);
}
private void showLog3(){
Log.d("FirstActivity","方法3获取到的分辨率:"+Test.getDeviceResolution3(this));
}
@Override
protected void onDestroy() {
super.onDestroy();
timer.cancel();
}
如果你想获得真正的像素高度,可以采用第三种方法。
最后,转载请注明出处,谢谢!
参考文章:https://www.imooc.com/article/79112/
|