Java “如何禁用”;“窗口动画比例”;在安卓4.0+;设备?

Java “如何禁用”;“窗口动画比例”;在安卓4.0+;设备?,java,android,android-animation,Java,Android,Android Animation,我正在使用一个服务,它使用WindowManager显示一个视图,每次我使用 windowManagerLayoutParams.height = newHeight; ((WindowManager) getSystemService(WINDOW_SERVICE)).updateViewLayout(mMainLayout, windowManagerLayoutParams); 如果手动禁用缩放动画,则不会发生动画。 手动禁用缩放动画,如下所示: 有没有办法以编程方式禁用我的应用程序的

我正在使用一个服务,它使用
WindowManager
显示一个视图,每次我使用

windowManagerLayoutParams.height = newHeight;
((WindowManager) getSystemService(WINDOW_SERVICE)).updateViewLayout(mMainLayout, windowManagerLayoutParams);
如果手动禁用缩放动画,则不会发生动画。 手动禁用缩放动画,如下所示:

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

您是否尝试了
活动#覆盖过渡(0,0)

退房:

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


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

如果查看的第1019行,您将看到0x00000040是PRIVATE\u FLAG\u NO\u MOVE\u动画的值。对我来说,当我通过改变大小时,这确实阻止了窗口动画出现在我的视图上


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

正如@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
    }
}

你能提供一个简短的视频来说明你的确切意思吗?有布局动画和活动动画,还有几十种不同的其他动画:DIt就像幻灯片动画。动画的类型并不重要,我只是想禁用它。答案并不取决于动画本身,而是取决于动画被触发的事件。如果是活动转换,答案不同于纯布局动画…它不是活动动画,因为没有涉及任何活动。是的,我做了。这不是一个活动动画,因为没有涉及任何活动。如果你有一个UI,我猜你应该有一个活动。情况并非总是这样。您可以通过WindowManager将视图附加为面板/覆盖,这听起来像他正在做的事情。我同意。我并没有说没有活动就不可能有用户界面,我只是建议他不要没有活动,因为真正可以接受的情况非常罕见。@BenoitDuffez这些类型的“黑客”的主要原因是(至少现在)出于测试目的。大部分是浓缩咖啡测试。Android只在4.3中添加了这个标志,所以动画仍然在其他设备上出现。@RonTesler这个标志叫什么名字?请添加来自android api的链接。我没有在这个类中设置标志。标志是PRIVATE_flag_NO_MOVE_ANIMATION,但正如我在回答中所说,这不是一个公共api,因此除了查找WindowManager的源代码之外,没有其他链接。
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
    }
}