背景:Android N 具有更改系统的功能Display Size
从设置中,除了以前存在的更改功能之外Font Size
.
更改显示尺寸:
图片来源:pcmag.com
Question:
如果一个应用程序有android.permission.WRITE_SETTINGS
允许更改设置,有多种方法可以以编程方式更改系统字体大小,如中所述如何以编程方式更改设备的字体设置:字体样式和字体大小?。但是我找不到以编程方式更改显示大小的方法。是否可以?
我试过什么?
我已经检查了列表中可能的选项设置.系统提供了以编程方式更改设置的便利功能。
Update:
我在这里提出了相同的功能请求:https://code.google.com/p/android/issues/detail?id=214124。如果您觉得有用,请加星标。
只是分享我解决这个要求的方法。我通过使用肮脏的Java反射方法来实现这个功能——尽管它不是那么优雅。
主要参考源码文件有:
- ScreenZoomSettings.java(https://github.com/aosp-mirror/platform_packages_apps_settings/blob/master/src/com/android/settings/display/ScreenZoomSettings.java)
- DisplayDensityUtils.java(http://androidxref.com/9.0.0_r3/xref/frameworks/base/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java)
- WindowManagerGlobal.java(http://androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/view/WindowManagerGlobal.java)
并且,按照以下步骤操作,即可获得所需的控件:
- Read
ZoomScreenSettings
.java 的 onCreate() 和 commit()。他们演示了如何正确获取密度值并将其设置到框架中。
- Read
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
数组来获取实际密度值,该值是传递给框架的正确密度值。获取电流密度指数也应用相同的概念。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)