我知道SetFlags的作用是用新标志替换旧标志。而且AddFlags正在附加更多标志。我只是感到困惑,为什么我通常看过的setflags方法中的论点?例如:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
//or
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
看一下android.view.window class之后,我不清楚为什么他们必须做许多二进制运算符(不是,和或)。这是什么目的?
public void setFlags(int flags, int mask) {
final WindowManager.LayoutParams attrs = getAttributes();
attrs.flags = (attrs.flags & ~mask) | (flags & mask);
mForcedWindowFlags |= mask;
dispatchWindowAttributesChanged(attrs);
}
另一个问题,
之间有什么区别//argument is a flag
getWindow().addFlags(flag1);
和
//argument is the result of OR operator of 2 identical flags
getWindow().addFlags(flag1 | flag1);
和
//argument is the result of OR operator of 2 different flags
getWindow().addFlags(flag1 | flag2);
和
//argument is the result of AND operator of 2 identical flags
getWindow().addFlags(flag1 & flag1);
和
//argument is the result of AND operator of 2 different flags
getWindow().addFlags(flag1 & flag2);
任何帮助将不胜感激。
二进制运算符是因为该字段是Bitfield。他们使用单个整数可以容纳许多设置,并且每个设置都分配给不同的位。然后,您使用二进制操作将它们组合起来并正确设置位。这是一种常见的硬件技术,非常有效。通常,您会通过使用或在上面打开一些(设置),并通过其倒数来将其删除。这两个操作都使其余的设置保持不变。
您永远不会看到setflags(foo | foo),因为它的冗余。所有发生的就是设置FOO。您会看到setflags(foo | bar),它可以设置foo和bar。
当您看到setFlags(foo,foo)时 - 第二个参数是掩码。它允许您同时打开和关闭字段,并且只有面罩中的位才会改变。因此,任何其他设置都将保持原样。数学基本上是((getflags& bask)|(value& mask))。如果您只想更改某些设置,并且想将它们全部打开,则您将在两个值中看到同一件事。setFlags(x,x)等效于Addflags(x)
查看window.java的来源
/**
* Convenience function to set the flag bits as specified in flags, as
* per {@link #setFlags}.
* @param flags The flag bits to be set.
* @see #setFlags
* @see #clearFlags
*/
public void addFlags(int flags) {
setFlags(flags, flags);
}
所以addFlags
与setFlags
相同,但更方便