避免在 WindowManager 中更新的自定义视图中的布局更改动画
Avoid layout change animations in custom view, that's updated in the WindowManager
我有一个自定义 RelativeLayout
,我什至已经设置了 setLayoutTransition(null);
。我使用 ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).updateViewLayout(this, layoutParams);
将此自定义视图添加到 WindowManager
我更改了自定义视图中的视图,我更改了 WindowManager
的 LayoutParams
,然后调用 updateViewLayout
...
我认为 LayoutParams
对 WindowManager
的更改是动画的,但我不确定...
如何禁用所有动画?
这个有点烦人。 Android 动画所有 window 更改,并且他们已将标志设为私有以禁用它。您可以使用 reflection
禁用 window 动画
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
不会对布局更改进行动画处理。请注意,当您更改 window 大小时,您可能会看到闪烁。我还没有找到解决这个问题的方法。
我有一个自定义 RelativeLayout
,我什至已经设置了 setLayoutTransition(null);
。我使用 ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).updateViewLayout(this, layoutParams);
我更改了自定义视图中的视图,我更改了 WindowManager
的 LayoutParams
,然后调用 updateViewLayout
...
我认为 LayoutParams
对 WindowManager
的更改是动画的,但我不确定...
如何禁用所有动画?
这个有点烦人。 Android 动画所有 window 更改,并且他们已将标志设为私有以禁用它。您可以使用 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
不会对布局更改进行动画处理。请注意,当您更改 window 大小时,您可能会看到闪烁。我还没有找到解决这个问题的方法。