如何在Android 4.0+设备上以编程方式禁用"窗口动画比例"?

Ron*_*ler 7 java android android-animation

我正在使用一个显示视图的服务,WindowManager每次使用时更改视图的大小都会出现动画

windowManagerLayoutParams.height = newHeight;
((WindowManager) getSystemService(WINDOW_SERVICE)).updateViewLayout(mMainLayout, windowManagerLayoutParams);
Run Code Online (Sandbox Code Playgroud)

如果我手动禁用缩放动画,则不会发生动画.手动禁用缩放动画,如下所示:http: //www.cultofandroid.com/11143/android-4-0-tip-how-to-find-and-disable-animations-for-a-snappier-experience/

有没有办法以编程方式为我的应用程序禁用窗口缩放动画?

cla*_*ark 15

我在使用SystemUI包中的系统覆盖时遇到了同样的问题,并决定挖掘源代码以查看是否可以找到解决方案. WindowManager.LayoutParams有一些隐藏的好东西,可以解决这个问题.诀窍是使用WindowManager.LayoutParams的privateFlags成员,如下所示:

windowManagerLayoutParams.privateFlags |= 0x00000040;
Run Code Online (Sandbox Code Playgroud)

如果查看WindowManager.java的第1019行,您将看到0x00000040是PRIVATE_FLAG_NO_MOVE_ANIMATION的值.对我来说,当我通过updateViewLayout()更改大小时,这确实阻止了我的视图上出现的窗口动画

我有使用系统包的优势,因此我可以直接在我的代码中访问privateFlags,但如果要访问此字段,则需要使用反射.

  • 该标志是 PRIVATE_FLAG_NO_MOVE_ANIMATION,但正如我在回答中所述,这不是公共 API,因此除了查看 WindowManager 的源代码外,没有其他链接。 (2认同)

Ped*_*ira 6

正如@clark所说,这可以使用反射来改变:

private void disableAnimations() {
    try {
        int currentFlags = (Integer) mLayoutParams.getClass().getField("privateFlags").get(mLayoutParams);
        mLayoutParams.getClass().getField("privateFlags").set(mLayoutParams, currentFlags|0x00000040);
    } catch (Exception e) {
        //do nothing. Probably using other version of android
    }
}
Run Code Online (Sandbox Code Playgroud)


Ben*_*fez -1

你试过了吗Activity#overridePendingTransition(0, 0)

查看文档

在 startActivity(Intent) 或 finish() 之一之后立即调用,以指定接下来要执行的显式过渡动画。

  • 情况并非总是如此。您可以通过 WindowManager 将视图附加为面板/覆盖层,这听起来像他正在做的事情。 (4认同)