背景:除了之前提供的更改Display Size
的功能外,Android N还具有从设置更改系统Font Size
的功能。
更改显示尺寸:
图片来源:pcmag.com
问题:
如果某个应用具有更改设置的android.permission.WRITE_SETTINGS
权限,则可以按照How to programmatically change font settings of Device: font style and font size?中的说明以编程方式更改系统字体大小。但是,我无法找到以编程方式更改显示大小的方法。可能吗?
我尝试了什么?
我已检查了Settings.System便捷功能列表中可能的选项,这些功能是以编程方式更改设置而提供的。
更新:
我已在此处打开了相同的功能请求:https://code.google.com/p/android/issues/detail?id=214124。如果你觉得它会有用,那就明星吧。
提前感谢您的帮助!
答案 0 :(得分:3)
只需分享我解决此要求的方法即可。我通过使用肮脏的Java反射方法来实现此功能-尽管效果不佳。
主要参考源代码文件是:
然后按照以下步骤操作,即可获得所需的控件:
ZoomScreenSettings
。java的onCreate()和commit()。他们演示了如何正确获取密度值并将其设置到框架中。DisplayDensityUtils
。java。它显示了如何使用WindowManagerService
来控制系统密度。因为我们无法通过反射获取DisplayDensityUtils
的实例,所以我们需要了解使用了哪种WindowManagerService
方法。WindowManagerService
的实例,并将类似DisplayDensityUtils
的类写入您的项目。// Where wm is short for window manager
val wmGlobalClz = Class.forName("android.view.WindowManagerGlobal")
val getWmServiceMethod = wmGlobalClz.getDeclaredMethod("getWindowManagerService")
val wmService = getWmServiceMethod.invoke(wmGlobalClz)
val wmInterfaceClz = Class.forName("android.view.IWindowManager")
// Now, we already have the ability to do many things we want.
// For instance, to get the default density value.
val getInitialDisplayDensityMethod = wmInterfaceClz.getDeclaredMethod(
"getInitialDisplayDensity",
Integer.TYPE
)
val defaultDensity = getInitialDisplayDensityMethod.invoke(
wmService,
Display.DEFAULT_DISPLAY
) as Int
DisplayDensityUtils
的类来设置或获取密度值。刚提到的一件事是,如果您想传递一个索引值(例如,对于大的显示尺寸,则为2),请将其馈送到类DisplayDensityUtils
的类的mValues
数组中以获取实际密度传递给框架的正确价值。获取当前密度指数也适用相同的概念。答案 1 :(得分:0)
在引用Settings.System时,有一个[putConfiguration(ContentResolver cr, Configuration config)
](https://developer.android.com/reference/android/provider/Settings.System.html#putConfiguration(android.content.ContentResolver,android.content.res.Configuration))方法。
使用此方法是:
中从配置对象中编写一批与配置相关的设置的便捷功能。
这包括用户指定的配置选项(区域设置列表和缩放)以及设备配置(例如输入模式,屏幕尺寸和屏幕方向) 强>)。
为屏幕大小设置SCREENLAYOUT_SIZE_MASK 值的配置。 它是:
SCREENLAYOUT_SIZE_MASK位定义屏幕的整体大小。它们可能是SCREENLAYOUT_SIZE_SMALL,SCREENLAYOUT_SIZE_NORMAL,SCREENLAYOUT_SIZE_LARGE或SCREENLAYOUT_SIZE_XLARGE中的一个。
我希望它会帮助你。
答案 2 :(得分:0)
在清单中,根据申请:android:configChanges="density"
在活动/应用程序中:
public void adjustDisplayScale(Configuration configuration) {
if (configuration != null) {
Log.d("TAG", "adjustDisplayScale: " + configuration.densityDpi);
if(configuration.densityDpi >= 485) //for 6 inch device OR for 538 ppi
configuration.densityDpi = 500; //decrease "display size" by ~30
else if(configuration.densityDpi >= 300) //for 5.5 inch device OR for 432 ppi
configuration.densityDpi = 400; //decrease "display size" by ~30
else if(configuration.densityDpi >= 100) //for 4 inch device OR for 233 ppi
configuration.densityDpi = 200; //decrease "display size" by ~30
DisplayMetrics metrics = getResources().getDisplayMetrics();
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(metrics);
metrics.scaledDensity = configuration.densityDpi * metrics.density;
this.getResources().updateConfiguration(configuration, metrics);
}
}
在super.onCreate(..)之后调用它:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
adjustDisplayScale( getResources().getConfiguration());
这将在“显示尺寸”的“较小”和“较小”设置之间设置显示尺寸,从而覆盖用户设置的任何显示尺寸设置。 对于4英寸,5.5英寸,6英寸等设备,它可以正确地自我调整。但是我敢肯定,有比使用那些if语句更好的方法。