【问题标题】:Avoid layout change animations in custom view, that's updated in the WindowManager避免在 WindowManager 中更新的自定义视图中的布局更改动画
【发布时间】:2015-07-10 10:20:58
【问题描述】:

我有一个自定义的RelativeLayout,我什至设置了setLayoutTransition(null);。我用((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).updateViewLayout(this, layoutParams);将此自定义视图添加到WindowManager

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

我认为,LayoutParamsWindowManager 的变化是动画的,但我不确定...

如何禁用所有动画?

【问题讨论】:

    标签: android animation view android-windowmanager


    【解决方案1】:

    这个有点烦人。 Android 会为所有窗口更改设置动画,并且他们已将标志设为私有。您可以使用 reflection 禁用窗口动画

        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 不会为布局更改设置动画。请注意,当您更改窗口大小时,您可能会看到闪烁。我还没有找到解决这个问题的方法。

    【讨论】:

    • 这就是我目前正在做的事情。我只使用flag |= 0x00000040; 而不是名称,我不调用Class.forName,而是直接使用该类。无论如何,谢谢,我会将您的答案标记为正确
    • 你必须使用Reflection,因为这是privateFlag。你不能把它作为一个普通的标志来应用。
    • ? 明白了。始终使用标志名称而不是常量。您永远不知道标志常量何时会发生变化,而您会遇到无法调试的问题。
    • 我这样做了,但仍然存在一个肉眼可见的故障,是否有人找到解决方法..
    • @sector11,一种可能的解决方案 - 调用 removeViewaddView 而不是 updateViewLayout
    猜你喜欢
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2018-11-06
    • 1970-01-01
    相关资源
    最近更新 更多