通过“设置/显示”放大屏幕,我发现我的galaxy s9 +的屏幕密度从430 dpi更改为600 dpi以上。
这使布局和图像从xxhdpi更改为xxxhdpi。
如果我有一个固定大小为16dp的textView,
在xxhdpi中为16 * 3像素,在xxxhdpi中将变为16 * 4像素。
这使我的布局(当然是来自editTexts或textViews的文本)变得更大,因为设备的实际密度从未改变,而google(或制造商samsumg)正是为此功能而设计的。
但是我不希望这种情况在我的应用程序中发生。
我已经尝试通过此方法进行修复;
Configuration configuration = activity.getResources().getConfiguration();
if (configuration.densityDpi != 430) {
configuration.densityDpi = 430;
}
DisplayMetrics metrics = activity.getResources().getDisplayMetrics();
WindowManager wm = (WindowManager) activity.getSystemService(activity.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(metrics);
metrics.scaledDensity = configuration.densityDpi * metrics.density;
activity.getResources().updateConfiguration(configuration, metrics);
这将强制屏幕密度变为430,并且在s9 +上可以正常工作。 但是,事实上,并非所有设备的默认密度都为430。
如何确定运行应用程序的设备的默认密度?
或者是否有忽略我应用程序放大效果的配置?
答案 0 :(得分:0)
这似乎对我有用。
DisplayMetrics displayMetrics = activity.getResources().getDisplayMetrics();
int snap = 20;
float exactDpi = (displayMetrics.xdpi + displayMetrics.ydpi) / 2;
float dpi = displayMetrics.densityDpi;
if (dpi - exactDpi > snap) {
int targetDpi = (int) (Math.ceil(exactDpi / snap) * snap);
Configuration config = activity.getResources().getConfiguration();
ErrorController.showMessage("adjustDisplayScale : " + config.densityDpi);
ErrorController.showMessage("targetDpi : " + targetDpi);
displayMetrics.densityDpi = targetDpi;
config.densityDpi = targetDpi;
displayMetrics.setTo(displayMetrics);
config.setTo(config);
activity.getResources().updateConfiguration(config, displayMetrics);
}