清楚地了解Android.view.window类中的addflags和setFlags



我知道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);
}

所以addFlagssetFlags相同,但更方便

相关内容

  • 没有找到相关文章

最新更新