如果设置 -> 显示 -> 显示大小更改为大或小,则禁用应用程序或 activity 缩放
Disabling an app or activity zoom if Setting -> Display -> Display size changed to Large or small
在我的应用程序中,我不想让它因为创建设计问题而调整大小。
我已经尝试在应用程序标签和启动器 activity 标签中使用 android:resizeableActivity="false"
,但没有用。
我假设您正在尝试获得显示,如果用户更改 phone 上关于 UI 大小的辅助功能选项,该显示不会改变。
您可以使用 DisplayMetrics 使它正常工作。
DisplayMetrics metrics = getResources().getDisplayMetrics();
与 "normal" 比例因子值 metrics.xdpi
和 metrics.densityDpi
具有相同的值。如果不是这种情况,您可以获得 "real" 比例因子,这是用户使用以下标准比例缩放时使用的比例因子。
if(metrics.xdpi != metrics.densityDpi){
Log.d(TAG,"Real scale " + (metrics.xdpi / metrics.densityDpi)*metrics.density);
}
然后你可以使用所述值乘以布局中的固定值,以便它可以在不同的屏幕上具有精确的密度。这也意味着布局中的 每个 值必须使用 px
而不是 dp
或 sp
。
虽然这种方法可行,但我强烈建议不要使用它。
首先,因为这是一项大量的工作,并且在以后的更新中很难维护该代码。
其次,Android的这个特性非常方便,如果你的应用程序没有用它编译,它可能会指出你应该更好地构造你的布局。
我已经找到解决办法了。
如果系统文本大小更改或显示大小设置为大(高于 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);
这里的答案只是部分正确,因为 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)
在我的应用程序中,我不想让它因为创建设计问题而调整大小。
我已经尝试在应用程序标签和启动器 activity 标签中使用 android:resizeableActivity="false"
,但没有用。
我假设您正在尝试获得显示,如果用户更改 phone 上关于 UI 大小的辅助功能选项,该显示不会改变。
您可以使用 DisplayMetrics 使它正常工作。
DisplayMetrics metrics = getResources().getDisplayMetrics();
与 "normal" 比例因子值 metrics.xdpi
和 metrics.densityDpi
具有相同的值。如果不是这种情况,您可以获得 "real" 比例因子,这是用户使用以下标准比例缩放时使用的比例因子。
if(metrics.xdpi != metrics.densityDpi){
Log.d(TAG,"Real scale " + (metrics.xdpi / metrics.densityDpi)*metrics.density);
}
然后你可以使用所述值乘以布局中的固定值,以便它可以在不同的屏幕上具有精确的密度。这也意味着布局中的 每个 值必须使用 px
而不是 dp
或 sp
。
虽然这种方法可行,但我强烈建议不要使用它。
首先,因为这是一项大量的工作,并且在以后的更新中很难维护该代码。
其次,Android的这个特性非常方便,如果你的应用程序没有用它编译,它可能会指出你应该更好地构造你的布局。
我已经找到解决办法了。
如果系统文本大小更改或显示大小设置为大(高于 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);
这里的答案只是部分正确,因为 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)