通过更改的显示缩放获取Android N上的px屏幕尺寸

时间:2017-06-13 10:47:56

标签: android size screen pixel android-7.0-nougat

我在Android N上使用更改的显示缩放计算显示尺寸时出现问题。

使用Android N,您可以更改显示缩放(选中here
但是如果用户从Android设置设置缩放,显示尺寸(... getSize())不会改变...

有什么想法解决它吗?我是否要使用px中的大小乘以scaledDensity来获得真实的显示尺寸?

我的应用程序动态创建以px计算屏幕尺寸的窗口和组件,组件是在服务器上设计的。 简单地说,我按照服务器上设置的宽度和智能手机屏幕的宽度进行数学比例:

DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
   display.getRealSize(sizePoint);
}else{
   display.getSize(sizePoint);
}
int smartphoneDisplayWidth =  sizePoint.x;
int smartphoneDisplayHeight = sizePoint.y;

int serverDisplayWidth = 720px; //this come from the server
int serverComponentWidth = 720px; //this come from the server
int smartphoneComponentWidth = (smartphoneDisplayWidth/serverDisplayWidth)*serverComponentWidth;
//ex: smartphoneComponentWidth = (1080/720)*720 = 1080; the component widht on the smartphone will be 1080px.

如果我设置较小的变焦我有这个问题:
默认
enter image description here




窗户组件要小:
enter image description here

px中的宽度不会改变,它只会改变密度:

DisplayMetrics{density=2.2250001, width=1080, height=1813, scaledDensity=2.2250001, xdpi=422.03, ydpi=424.069}

默认

DisplayMetrics{density=2.625,     width=1080, height=1794, scaledDensity=2.625,     xdpi=422.03, ydpi=424.069}

DisplayMetrics{density=2.875,     width=1080, height=1782, scaledDensity=2.875,     xdpi=422.03, ydpi=424.069}

DisplayMetrics{density=3.125,     width=1080, height=1770, scaledDensity=3.125,      xdpi=422.03, ydpi=424.069}

最大

DisplayMetrics{density=3.375,     width=1080, height=1758, scaledDensity=3.375,      xdpi=422.03, ydpi=424.069}

1 个答案:

答案 0 :(得分:1)

您应该使用dp值而不是px创建视图。当密度发生变化时(如在nugat设置中),您会在第二个屏幕中看到结果。

你可能会创建这样的布局:

int screenWidth = <value>;
LayoutParams lp = new LayoutParams(screenWidth, 200);
view.setlayoutparams(lp);

你应该使用密度:

float sampleDensity = 2f; // get from DisplayMetrics
int screenWidth = <value>;
LayoutParams lp = new LayoutParams((int) (screenWidth * sampleDensity), 200);
view.setlayoutparams(lp);

其他原因可能是您在配置更改后未更新布局。更好的解决方案是在LayoutParams中使用MATCH_PARENTWRAP_CONTENT。它更方便快捷的解决方案。