如何在Android中默认强制屏幕密度

5
通过“设置/显示”将屏幕放大,我发现我的Galaxy S9+屏幕密度从430dpi变为了超过600dpi的某个值。
这使得布局和图像变成了xxhdpi到xxxhdpi。
如果我有一个textView其固定大小为16dp,
在xxhdpi中它是16 * 3px,在xxxhdpi中它将变为16 * 4px。
由于设备的实际密度从未改变,这使得我的布局(当然包括来自editText或textView的文本)变得更大,而这正是Google(或制造商三星)打算使用此功能的原因。
但我不希望这种情况在我的应用中发生。
我已经尝试通过以下方式修复它;
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,在Galaxy S9+上运行良好。 但实际上,对于所有设备,默认密度都不会是430。

我如何确定运行我的应用程序的设备的默认密度?

或者是否有一种配置可以忽略我的应用程序的放大效果?


我也陷入了类似的困境。你最后找到解决方法了吗? - Shreyas Murali
1个回答

3

这个对我来说似乎有效。

        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);
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接