gpt4 book ai didi

android - 以编程方式更改系统显示大小 Android N

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:44:36 28 4
gpt4 key购买 nike

背景:除了之前存在的更改字体大小的功能外,Android N 还具有从设置中更改系统显示大小的功能>。

更改显示尺寸:

enter image description here

图片来源: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 .如果您觉得有用,请给它加注星标。

最佳答案

只需分享我解决此要求的方法。我通过使用肮脏的 Java 反射方法实现了这个功能 - 虽然它不是那么优雅。

主要引用的源码文件有:

然后,按照下面的步骤,你就可以获得所需的控件:

  1. 阅读 ZoomScreenSettings.java 的 onCreate() 和 commit()。他们演示了如何在框架中正确获取和设置密度值。
  2. 阅读 DisplayDensityUtils.java。它展示了如何使用 WindowManagerService 来控制系统密度。因为我们无法通过反射获取DisplayDensityUtils的实例,所以我们需要了解使用了哪些WindowManagerService方法。
  3. 使用反射获取 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

  1. 使用类似 DisplayDensityUtils 的类设置或获取密度值。只是要提到的一件事是,如果你想传递一个索引值(例如,2 表示大显示尺寸),请将它提供给你的 DisplayDensityUtils - 类的 mValues数组以获得传递给框架的正确密度值。获取电流密度指数也是同理。

关于android - 以编程方式更改系统显示大小 Android N,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37996601/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com