Mar*_*il4 5 android android-layout screen-density
通过“设置/显示”放大屏幕,我发现我的 Galaxy s9+ 的屏幕密度从 430 dpi 变为超过 600 dpi。
这使得布局和图像从 xxhdpi 更改为 xxxhdpi。
如果我有一个固定大小为 16dp 的 textView,
在 xxhdpi 中它是 16 * 3 px,在 xxxhdpi 中将变成 16 * 4 px。
这使得我的布局(当然来自 editTexts 或 textViews 的文本)变得更大,因为设备的实际密度永远不会改变,谷歌(或制造商 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);
Run Code Online (Sandbox Code Playgroud)
这迫使屏幕密度变为 430,并且在 Galaxy s9+ 上运行良好。但事实上,并非所有设备的默认密度都是 430。
如何确定运行我的应用程序的设备的默认密度?
或者是否有配置可以忽略我的应用程序的放大效果?
这似乎对我有用。
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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4140 次 |
| 最近记录: |