如果设置 -> 显示 -> 显示大小更改为大或小,则禁用应用程序或活动缩放

Posted

技术标签:

【中文标题】如果设置 -> 显示 -> 显示大小更改为大或小,则禁用应用程序或活动缩放【英文标题】:Disabling an app or activity zoom if Setting -> Display -> Display size changed to Large or small 【发布时间】:2018-10-19 12:22:50 【问题描述】:

在我的应用程序中,我不想让它调整大小作为其创建设计问题。

我尝试在应用程序标签和启动器活动标签中使用android:resizeableActivity="false",但没有帮助。

【问题讨论】:

【参考方案1】:

我假设您正在尝试获得不会改变的显示,如果用户更改了手机上关于 UI 大小的辅助功能选项。

您可以使用 DisplayMetrics 来完成这项工作。

DisplayMetrics metrics = getResources().getDisplayMetrics();

“正常”比例因子值metrics.xdpimetrics.densityDpi 具有相同的值。如果不是这种情况,您可以获得“真实”比例因子,即用户使用以下方法使用正常缩放时使用的比例因子。

if(metrics.xdpi != metrics.densityDpi)
        Log.d(TAG,"Real scale " +  (metrics.xdpi / metrics.densityDpi)*metrics.density);

您可以使用所述值将布局中的固定值相乘,以便它可以在不同屏幕上具有精确的密度。这也意味着布局中的每个值必须使用px 而不是dpsp


虽然这种方法可行,但我强烈建议不要使用它。

首先,因为工作量很大,而且在未来的更新中很难维护该代码。

其次,Android的这个特性非常方便,如果你的应用不能用它编译,它可能会指出你应该更好地构建你的布局。

【讨论】:

@SportyAndroidDev 这个答案对你有帮助吗?【参考方案2】:

我已经找到了解决办法。

如果系统文本大小更改或显示大小设置为大(Android Oreo 以上),您的应用将正常运行(无大文本和缩放视图),代码如下:

        Configuration configuration = getResources().getConfiguration();
        configuration.fontScale = (float) 1; //0.85 small size, 1 normal size, 1,15 big etc
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        metrics.scaledDensity = configuration.fontScale * metrics.density;
        configuration.densityDpi = (int) getResources().getDisplayMetrics().xdpi;
        getBaseContext().getResources().updateConfiguration(configuration, metrics);

【讨论】:

相当老套的解决方案,但它确实对我有用。确保将其放在onCreate 之前 setContentView 中,否则屏幕旋转后将无法使用【参考方案3】:

这里的答案只是部分正确,因为 xdpi 和 densityDPI 仅在模拟器中重合,所有手机的 xdpi 不同,而 densitydpi 相同,因此这样做会更明智:

val configuration = getResources().getConfiguration()
    val metrics = getResources().getDisplayMetrics()
    Log.d("TAG", metrics.toString() + " " + getResources().getConfiguration())
    when (resources.displayMetrics.xdpi)  //change size to ignore display size
        in 1..120 -> 
            configuration.densityDpi = 120
        
        in 121..160 -> 
            configuration.densityDpi = 160
        
        in 161..240 -> 
            configuration.densityDpi = 240
        
        in 241..320 -> 
            configuration.densityDpi = 320
        
        in 321..480 -> 
            configuration.densityDpi = 480
        
        in 481..640 -> 
            configuration.densityDpi = 640
        
    
    getBaseContext().getResources().updateConfiguration(configuration, metrics)

【讨论】:

这段代码无法编译!你能分享一下这个编译的相同概念吗?谢谢。 没关系它只需要一个 null !检查 resources.displayMetrics.xdpi 的末尾。

以上是关于如果设置 -> 显示 -> 显示大小更改为大或小,则禁用应用程序或活动缩放的主要内容,如果未能解决你的问题,请参考以下文章

Kivy - 如何根据显示大小设置窗口大小?

调整 QML 图像显示大小

如何设置opengl对象的大小?

sublime怎么设置字体大小

QTextEdit 在调整大小时不显示水平滚动条

为什么JFrame setSize()方法没有正确设置大小?