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