9

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

windowManagerLayoutParams.height = newHeight;
((WindowManager) getSystemService(WINDOW_SERVICE)).updateViewLayout(mMainLayout, windowManagerLayoutParams);

如果我手动禁用缩放动画,则不会出现动画。像这样手动禁用缩放动画: http ://www.cultofandroid.com/11143/android-4-0-tip-how-to-find-and-disable-animations-for-a-snappier-experience/

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

4

3 回答 3

16

我在处理 SystemUI 包中的系统覆盖时遇到了同样的问题,并决定深入研究源代码,看看是否能找到解决方案。 WindowManager.LayoutParams有一些隐藏的好东西可以解决这个问题。诀窍是像这样使用WindowManager.LayoutParams的 privateFlags 成员:

windowManagerLayoutParams.privateFlags |= 0x00000040;

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

我有在系统包上工作的优势,所以我可以直接在我的代码中访问 privateFlags,但是如果你想访问这个字段,你将需要使用反射。

于 2013-10-07T18:03:29.927 回答
8

正如@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
    }
}
于 2015-10-16T13:04:34.310 回答
0

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

查看文档

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

于 2013-07-22T12:47:50.407 回答