为什么在以下方法中重复使用常量FLAG_FULLSCREEN代替int掩码?

时间:2015-11-27 21:24:44

标签: java android

setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

1 个答案:

答案 0 :(得分:0)

public void setFlags(int flags, int mask) {
    final WindowManager.LayoutParams attrs = getAttributes();
    attrs.flags = (attrs.flags&~mask) | (flags&mask);
    mForcedWindowFlags |= mask;
    dispatchWindowAttributesChanged(attrs);
}

source

组合使用两个int参数来指定要设置的窗口标志字段的哪些位。

第一个是从中复制的来源,例如

0000 0010 0000 0000

但这本身是不够的,因为程序无法知道应该复制哪些位以及要保留的目标字段中的哪些位。也许你甚至想设置一个0

所以第二个参数(mask)指定第一个参数中的哪些位。 E.g。

0000 0011 0000 0000

意味着您要复制第7位和第8位

0000 0010 0000 0000
0000 0011 0000 0000
------------------- 
.... ..10 .... ....   << sets those to bits two 10 while the rest remains untouched

使用标志两次的效果是

0000 0010 0000 0000
0000 0010 0000 0000
------------------- 
.... ..1. .... ....

只是一种方式来指定你真正意味着一位标志。您也可以使用flags字段中的所有1。

首先假设attrs.flags(当前活动的窗口标志)的值为

0000 0000 0101 0101
       ^    ^   ^ ^- FLAG_ALLOW_LOCK_WHILE_SCREEN_ON is enabled
       |    |   |
       |    |   |--- another enabled feature
       |    |
       |    -------- a flag that isn't set.  
    assume this is FLAG_FULLSCREEN

现在您只想设置1个缺失位,但FLAG_FULLSCREEN是完整的32位int。如果你只是覆盖所有内容,你将失去所有其他设置的好位。

setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

表示:&#34;从参数1中的32位中取出参数2中启用的位,并用它们替换attrs.flags的内容。&#34;

    0000 0000 0101 0101
  + .... ..1. .... .... (param1 combined with param2, dots are "masked out")
  = 0000 0010 0101 0101

现在还设置了全屏标志。