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

时间:2013-06-18 10:31:49

标签: java android android-animation

我正在使用服务,使用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/

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

3 个答案:

答案 0 :(得分:15)

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

windowManagerLayoutParams.privateFlags |= 0x00000040;

如果查看WindowManager.java的第1019行,您会看到0x00000040是PRIVATE_FLAG_NO_MOVE_ANIMATION的值。对我来说,当我通过updateViewLayout()

更改大小时,这确实阻止了我的视图中出现的窗口动画

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

答案 1 :(得分: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
    }
}

答案 2 :(得分:0)

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

结帐the documentation

  

在startActivity(Intent)或finish()的一种风格之后立即调用,以指定下一步要执行的显式转换动画。