如何以编程方式检查删除动画辅助功能设置的状态

How to check status of Remove Animations accessibility setting programmatically

我正在尝试检查 Remove animations 辅助功能设置的状态,以便 enable/disable 在我的应用程序上显示一些 UI 和 GIF 动画,但我没有看到任何AccessibilityManager 中公开的方法以访问此值:

有什么简单的方法可以访问这个值吗?即使有反射

我已经检查过,当这个值被切换时,3 个值被修改:

//global settings
animator_duration_scale=0
transition_animation_scale=0
window_animation_scale=0

您可以通过检查以编程方式确定这些:

    if (Settings.Global.getFloat(context.contentResolver, Settings.Global.ANIMATOR_DURATION_SCALE) == 0f)
         // Animations Off behaviour
    else
         // Animations On behaviour

我做了一个方法来检查所有三个都不为 0(因为所有 3 个都对齐,我认为这些有时可以在其他地方切换):

    fun animationsEnabled(): Boolean =
        !(Settings.Global.getFloat(contentResolver, Settings.Global.ANIMATOR_DURATION_SCALE) == 0f
                && Settings.Global.getFloat(contentResolver, Settings.Global.TRANSITION_ANIMATION_SCALE) == 0f
                && Settings.Global.getFloat(contentResolver, Settings.Global.WINDOW_ANIMATION_SCALE) == 0f)

记住这些是缩放数字,所以它们不仅仅是 0 和 1!这就是为什么我们需要获取它们的浮点值以及为什么我们检查是否为 0。然后我们需要记住,如果动画关闭,它们将全部设置为 0。

来源:

  1. https://developer.android.com/reference/android/provider/Settings.Global#ANIMATOR_DURATION_SCALE
  2. https://developer.android.com/reference/android/provider/Settings.Global#TRANSITION_ANIMATION_SCALE
  3. https://developer.android.com/reference/android/provider/Settings.Global#WINDOW_ANIMATION_SCALE

关于quintin-balsdon提供的上述解决方案的一个说明: 使用具有默认值的 Settings.Global.getFloat 版本很重要,因为看起来(至少在模拟器上)如果 'Remove animation' 从未在给定设备上打开,那么(至少)键 Settings.Global.ANIMATOR_DURATION_SCALE 的设置将不存在,此代码将导致异常。

因此我建议:

fun Context.animationsEnabled(): Boolean =
    !(Settings.Global.getFloat(contentResolver, Settings.Global.ANIMATOR_DURATION_SCALE, 1.0f) == 0f
            && Settings.Global.getFloat(contentResolver, Settings.Global.TRANSITION_ANIMATION_SCALE, 1.0f) == 0f
            && Settings.Global.getFloat(contentResolver, Settings.Global.WINDOW_ANIMATION_SCALE, 1.0f) == 0f)