Android 避免在自定义视图中更改布局动画,即';在WindowManager中更新了

Android 避免在自定义视图中更改布局动画,即';在WindowManager中更新了,android,animation,view,android-windowmanager,Android,Animation,View,Android Windowmanager,我有一个自定义的RelativeLayout,甚至还设置了setLayoutTransition(null)。我使用((WindowManager)context.getSystemService(context.WINDOW\u SERVICE)).updateViewLayout(这是layoutParams)将此自定义视图添加到WindowManager中 我在自定义视图中更改视图,并更改WindowManager的LayoutParams,然后调用updateViewLayout 我想,

我有一个自定义的
RelativeLayout
,甚至还设置了
setLayoutTransition(null)。我使用
((WindowManager)context.getSystemService(context.WINDOW\u SERVICE)).updateViewLayout(这是layoutParams)将此自定义视图添加到WindowManager中

我在自定义视图中更改视图,并更改
WindowManager的
LayoutParams
,然后调用
updateViewLayout

我想,
WindowManager
LayoutParams
的变化是动态的,但我不确定


如何禁用所有动画?

这一个有点烦人。Android为所有窗口更改设置动画,并且他们已经设置了禁用私有窗口的标志。您可以使用反射禁用窗口动画

    WindowManager.LayoutParams wp = new WindowManager.LayoutParams();
    String className = "android.view.WindowManager$LayoutParams";
    try {
        Class layoutParamsClass = Class.forName(className);

        Field privateFlags = layoutParamsClass.getField("privateFlags");
        Field noAnim = layoutParamsClass.getField("PRIVATE_FLAG_NO_MOVE_ANIMATION");

        int privateFlagsValue = privateFlags.getInt(wp);
        int noAnimFlag = noAnim.getInt(wp);
        privateFlagsValue |= noAnimFlag;

        privateFlags.setInt(wp, privateFlagsValue);

        // Dynamically do stuff with this class
        // List constructors, fields, methods, etc.

    } catch (ClassNotFoundException e) {
        Logger.l.e(e.toString());
        // Class not found!
    } catch (Exception e) {
        Logger.l.e(e.toString());
        // Unknown exception
    }

现在,
wp
将不会设置布局更改的动画。注意:更改窗口大小时,可能会看到闪烁。我还没有找到解决这个问题的方法。

这就是我目前正在做的。我只使用
标志|=0x00000040
而不是名称,我不调用
Class.forName
,而是直接使用该类。无论如何,谢谢你,我会将你的答案标记为正确。你必须使用
反射
,因为这是一个
私有标志
。你不能只是把它当作一个普通的标志。我这样做了,但仍然有一个肉眼可见的小故障。有人找到解决办法了吗?@sector11,一个可能的解决方案-调用
removeView
addView
而不是
updateViewLayout