在android.view.Window类中明确addFlags和setFlags

时间:2017-12-17 11:28:54

标签: android android-windowmanager android-window

我知道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类之后,我不清楚为什么他们必须做很多二元运算符(NOT,AND,OR)。这是什么目的?

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 | flag 2);

//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);

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:6)

二元运算符是因为该字段是位域。它们使用单​​个整数来保存大量设置,并且每个设置都分配给不同的位。然后,您可以使用二进制操作来组合它们并正确设置位。这是一种常见的硬件技术,其空间效率非常高。通常你会在它上面使用OR来打开一个位(一个设置),并通过ANDing它的逆来删除它。这两个操作都保持其余设置不变。

你永远不会看到setFlags(FOO | FOO),因为它是多余的。所有这一切都将被设置为FOO。你会看到setFlags(FOO | BAR),它会同时设置FOO和BAR。

当你看到setFlags(FOO,FOO)时 - 第二个参数是一个掩码。它允许您同时打开和关闭字段,并且只有掩码中的位会发生变化。所以任何其他设置都将保持不变。数学基本上是((getFlags& ~mask)|(value& mask))。如果您只想更改某些设置,并且想要全部打开它们,您会在两个值中看到相同的内容。 setFlags(x,x)等同于addFlags(x)