这行代码在Java(Android)中是如何求值的?

insrf1ej  于 2022-12-21  发布在  Android
关注(0)|答案(1)|浏览(93)

我正在编写Android开发者教程“使用沉浸式全屏模式”
一切都很好,直到我发现了这个代码片段。

private void hideSystemUI() {
    // Set the IMMERSIVE flag.
    // Set the content to appear under the system bars so that the content
    // doesn't resize when the system bars hide and show.
    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);
}

我对setSystemUiVisibility(int)方法有点困惑,因为我不知道如何计算这个条件。
为什么这个方法会接收多个整数值?
也许这是Java语言的一个非常基本的概念,但我以前从未使用过或见过它。

92dk7w1h

92dk7w1h1#

setSystemUiVisibility实际上是接收1个整数。您在这里看到的是位标志。您看到的所有View常量都是使用按位或组合的。
其思想是一个标志代表一个切换:开或关,1或0。典型的表示方法是使用boolean,它具有值truefalse。但boolean占用4个字节(为了简单起见),它是32位。那么,这个boolean实际上可以用来表示32个不同的标志,1或0有32个位置!整数也一样(大小为4字节)。所以让我们用一个整数来保存一堆标志,并在初始时将它们全部设置为0。
然后我们可以使用按位或运算符(|,注1,而不是2)来指定哪个位标志设置为“真”,如下所示:

00000000 | 00100000 = 00100000
00100000 | 00000001 = 00100001

第二个数字显示了我们要设置为true的标志。现在你的变量有了值(来自文档):

View.SYSTEM_UI_FLAG_LAYOUT_STABLE          = 0x0100 = 0000 0001 0000 0000
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION = 0x0200 = 0000 0010 0000 0000
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN      = 0x0400 = 0000 0100 0000 0000
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION        = 0x0002 = 0000 0000 0000 0010
View.SYSTEM_UI_FLAG_FULLSCREEN             = 0x0004 = 0000 0000 0000 0100
View.SYSTEM_UI_FLAG_IMMERSIVE              = 0x0800 = 0000 1000 0000 0000

当你用按位或将它们组合在一起时,你会得到0000 1111 0000 0110 = 0x0F06 = 3846。
注意:为了简单和可读性,我没有表示32位。我写的所有二进制数都应该有前导0,以防混淆。

相关问题