这些管道字符是什么?

时间:2017-11-16 16:15:05

标签: android

我在java中知道意味着包容性,或者我从未真正使用过,但现在我在我的应用程序中使用的这段代码中看到了它。为什么这样使用它又做了什么?

mDecorView.setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_LAYOUT_STABLE
        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
        | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
        | View.SYSTEM_UI_FLAG_IMMERSIVE);

1 个答案:

答案 0 :(得分:3)

在android API中View.setSystemUiVisibility()用于修改各种视图装饰的可见性。

您可以使用标记选择各种功能。

不同的标志具有不同的含义,并在官方文档中详细记录:setSystemUiVisibility

如果您不熟悉按位操作,则应先浏览this

这种表示法是一种非常常见的技术,用于编码"集"在一个单一的机器词:

View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
    | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
    | View.SYSTEM_UI_FLAG_IMMERSIVE

数学上或只设置一位的机器字将为每两个唯一操作数产生一个唯一值。因此,如果您有复合值,则始终可以分解回到用于生成它的原始值。这些位必须是偏移的,否则无法提取原始值。

如果您有两个二进制值,只有一个位设置为00010010,那么对它们进行OR运算会生成二进制值0011。现在,您可以传递该机器字,然后在必要时将其分解为两个原始值。

在阅读wikipedia文章后,您应该能够理解以下内容:

int FLAG1 = 0x1; //0001
int FLAG2 = 0x2; //0010
int FLAG3 = 0x4; //0100
// combine using OR
int flags = FLAG1 | FLAG3; //==0101 (5)
// using + is possible as well but can lead to errors:
// flags += FLAG1
// flags now is 0110 but you didn't mean to enable FLAG2
...
// remove a flag
flags &= ~FLAG1;
// toggle a flag
flags ^= FLAG3
// decompose
if(flags & FLAG1)
{
    //we know flag1 was set.
}

如果再次打开android docs,您会看到它为每个标志提到十六进制的常量值:

  

SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

     

...

     

常数值:512(0x00000200)

SYSTEM_UI_FLAG_LAYOUT_STABLE = 0x00000100 (256)
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION = 0x00000200 (512)

如上所述:value | FLAG请求某些功能,value & ~FLAG将其关闭,value ^ FLAG切换它。

根据您设置的标志,Android代码组合值的内部深度将被分解并启用和禁用各种功能。