2017-12-17 216 views
1

古いフラグを新しいフラグで置き換えるsetFlagsの機能を知っています。 addFlagsはさらにフラグを追加しています。私はちょうど私が通常同じ見たsetFlagsメソッドの引数がなぜ混乱しているのですか?たとえば :android.view.Windowクラスを見てとった後android.view.Windowクラスの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); 

、私はなぜ彼らは多くの二項演算子を行う必要があることを明確に(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); 
    } 

もう一つ質問、

//argument is a flag 
getWindow().addFlags(flag1); 

//argument is the result of OR operator of 2 identical flags 
getWindow().addFlags(flag1 | flag1); 

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

の違いは何ですか
//argument is the result of AND operator of 2 identical flags 
getWindow().addFlags(flag1 & flag1); 

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

任意の助けいただければ幸いです。

答えて

1

バイナリ演算子は、フィールドがビットフィールドであるためです。それらは単一の整数を使用して多くの設定を保持し、各設定は異なるビットに割り当てられます。バイナリ演算を使用してそれらを結合し、ビットを正しく設定します。これは一般的なハードウェア技術であり、非常にスペース効率が良いです。一般的には、ORを使ってビット(設定)をオンにし、その逆数をANDで取り除きます。これらの操作では、残りの設定は変更されません。

setFlags(FOO | FOO)は冗長であるため表示されません。 FOOが設定されることはすべて起こります。 setFlags(FOO | BAR)が表示され、FOOとBARの両方が設定されます。

setFlags(FOO、FOO)が表示されたら、2番目のパラメータはマスクです。同時にフィールドをオン/オフすることができ、マスク内のビットだけが変更されます。他の設定はそのまま維持されます。数学は基本的に((getFlags &〜マスク)|(値&マスク)です)。特定の設定を変更したいだけで、すべての設定をオンにしたい場合は、両方の値に同じことが表示されます。 setFlags(x、x)はaddFlags(x)と同じです。

+0

あなたは私にとって素晴らしい教師です。しかし、私はWikiを読んで、あなたの答えを理解することができました。それは私の知識からです。私はまだ少し混乱しています。 2つの異なる引数を持つsetFlagsを使用した例を教えてください。あなたがその事例を説明することができれば幸いです。 –

+0

フラグを簡単にオフにする。 setFlags(0、FOO)はfooをオフにします。 setFlags(FOO、FOO | BAR)はfooとオフバーをオンにします。 –

+0

clearFlags(FOO)の使用は、setFlags(0、FOO)より明確です。 setFlags(FOO、FOO | BAR)がfooとオフバーをオンにする理由をより詳しく説明できますか? setFlags(FOO、BAR)はどうですか? –

関連する問題