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

我在
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.

如果我设置较小的缩放我有这个问题:
默认:
《通过更改的显示缩放获取Android N上的px屏幕尺寸》
小:
windows组件很小:
《通过更改的显示缩放获取Android N上的px屏幕尺寸》

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}

最佳答案 您应该使用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_PARENT和WRAP_CONTENT.它更方便快捷的解决方案.

点赞