如果设置 -> 显示 -> 显示大小更改为大或小,则禁用应用程序或活动缩放
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.xdpi
和metrics.densityDpi
具有相同的值。如果不是这种情况,您可以获得“真实”比例因子,即用户使用以下方法使用正常缩放时使用的比例因子。
if(metrics.xdpi != metrics.densityDpi)
Log.d(TAG,"Real scale " + (metrics.xdpi / metrics.densityDpi)*metrics.density);
您可以使用所述值将布局中的固定值相乘,以便它可以在不同屏幕上具有精确的密度。这也意味着布局中的每个值必须使用px
而不是dp
或sp
。
虽然这种方法可行,但我强烈建议不要使用它。
首先,因为工作量很大,而且在未来的更新中很难维护该代码。
其次,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 的末尾。以上是关于如果设置 -> 显示 -> 显示大小更改为大或小,则禁用应用程序或活动缩放的主要内容,如果未能解决你的问题,请参考以下文章