2017-12-17 66 views
1

setFlags가 이전 플래그를 새 플래그로 대체하는 이유를 알고 있습니다. addFlags가 더 많은 플래그를 추가합니다. 난 그냥 setFlags 메서드에서 인수가 일반적으로 동일한 것을 본 이유는 무엇입니까? 예를 들어 는 :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); 

android.view.Window 클래스를 살펴 복용 후, 나는 그들이 많은 바이너리 연산자를 수행해야하는 이유 (NOT, AND, OR)를 명확하지 않다. 이것의 목적은 무엇입니까?

//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); 

,617의 차이가 무엇인지

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 the result of AND operator of 2 different flags 
getWindow().addFlags(flag1 & flag2); 

어떤 도움

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

을 감상 할 수있다.

답변

1

이진 연산자는 필드가 비트 필드이기 때문에 있습니다. 그들은 하나의 정수를 사용하여 많은 설정을 유지하며 각 설정은 다른 비트에 할당됩니다. 그런 다음 이진 연산을 사용하여이를 결합하고 비트를 올바르게 설정합니다. 이것은 일반적인 하드웨어 기술로 매우 공간 효율적입니다. 일반적으로 OR을 사용하여 비트 (설정)를 켜고 역수를 AND 연산하여 제거합니다. 두 작업 모두 나머지 설정을 변경하지 않습니다.

중복되므로 setFlags (FOO | FOO)가 표시되지 않습니다. FOO가 설정되는 모든 일이 설정됩니다. FOO와 BAR을 모두 설정하는 setFlags (FOO | BAR)가 표시됩니다.

setFlags (FOO, FOO)가 표시되면 두 번째 매개 변수가 마스크입니다. 동시에 필드를 켜고 끌 수 있으며 마스크의 비트 만 변경됩니다. 그래서 다른 설정은 그대로 유지됩니다. 수학은 기본적으로 (getFlags & ~ mask) | (값 & 마스크)입니다. 특정 설정 만 변경하려는 경우 두 값 모두에서 같은 것을 볼 수 있으며 모두 켜기를 원할 수 있습니다. setFlags (x, x)는 addFlags (x)와 같습니다.

+0

당신은 훌륭한 교사입니다. 그러나, 나는 당신의 대답이 이해가 안되기 때문에 wiki를 읽어야했다 :) 나는 아직도 약간의 혼란을 가지고있다. 두 개의 다른 인수가있는 setFlags를 사용하여 예제를 제공 할 수 있습니까? 그리고 그 예를 설명 할 수 있으면 행복 할 것입니다. –

+0

깃발을 쉽게 끄려면. setFlags (0, FOO)는 foo를 끕니다. setFlags (FOO, FOO | BAR)는 foo와 off 막대를 켭니다. –

+0

clearFlags (FOO) 사용은 setFlags (0, FOO)보다 명확합니다. setFlags (FOO, FOO | BAR)가 foo와 off 막대를 켜는 이유를 자세히 설명해 주시겠습니까? setFlags (FOO, BAR)는 어떻습니까? –