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

Hai*_*ack 3 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);
Run Code Online (Sandbox Code Playgroud)

看了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);
    }
Run Code Online (Sandbox Code Playgroud)

还有一个问题,有什么区别

//argument is a flag
getWindow().addFlags(flag1);
Run Code Online (Sandbox Code Playgroud)

//argument is the result of OR operator of 2 identical flags
getWindow().addFlags(flag1 | flag1);
Run Code Online (Sandbox Code Playgroud)

//argument is the result of OR operator of 2 different flags
getWindow().addFlags(flag1 | flag 2);
Run Code Online (Sandbox Code Playgroud)

//argument is the result of AND operator of 2 identical flags
getWindow().addFlags(flag1 & flag1);
Run Code Online (Sandbox Code Playgroud)

//argument is the result of AND operator of 2 different flags
getWindow().addFlags(flag1 & flag2);
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

Gab*_*han 8

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

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

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


Vla*_*lad 5

查看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);
}
Run Code Online (Sandbox Code Playgroud)

所以addFlags是一样的setFlags但是更方便