【问题标题】:What are these pipe characters?这些管道字符是什么?
【发布时间】:2017-11-16 16:15:04
【问题描述】:

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

【问题讨论】:

  • 或。意思是加法。

标签: android


【解决方案1】:

在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

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

如果您有两个二进制值,其中只有一位设置了 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 代码内部的组合值将被分解,并根据您设置的标志启用和禁用各种功能。

【讨论】:

    猜你喜欢
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多