Android

[Android] Dialog Dim 효과 처리 방법

중곰 2024. 11. 29. 09:34

* setDimAmount(0f) vs clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) 차이점

 

배경 효과 Dim 레이어는 존재하지만 완전히 투명하게 설정됨 (0f). Dim 레이어가 완전히 제거됨.
Status Bar (상태바) 영향 Dim 레이어가 상태바까지 포함하여 적용됨. Dim 레이어가 없으므로 상태바는 전혀 영향을 받지 않음.
Dim 강도 조절 가능 여부 강도를 동적으로 조절 가능 (0f ~ 1f). 강도 조절 불가, Dim 효과가 아예 없음.
사용 사례 Dim 효과를 동적으로 조절해야 하는 경우. Dim 효과가 필요 없는 Dialog에서 사용.
System UI(시스템 UI)와의 상호작용 Dim 강도에 따라 상태바가 투명하거나 흐릿하게 보일 수 있음. 상태바는 항상 완전하게 보임.

동작 방식

  1. setDimAmount(0f)
    • 배경 Dim 의 강도를 설정하는 함수로, **0f**로 설정 시 완전히 투명하게 만듭니다.
    • Dim 레이어는 여전히 화면 전체(상태바 포함)를 덮고 있으며, 강도만 조정됩니다.
  2. clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
    • Dim 레이어를 제어하는 플래그를 제거하여 Dim 효과를 완전히 비활성화합니다.
    • Dim 레이어 자체가 생성되지 않아 상태바와 화면 배경 모두 영향을 받지 않습니다.

언제 사용할까?

  • setDimAmount(0f) 사용:
    • 배경 Dim 강도를 동적으로 조절해야 하는 경우 적합합니다.
    • 예: 사용자와의 상호작용에 따라 Dimming 효과를 켜거나 끄는 다이얼로그.
  • clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) 사용:
    • Dim이 전혀 필요 없는 다이얼로그(예: 로더, 툴팁)에서 사용합니다.
    • 상태바와 배경을 완전히 유지해야 할 때 적합합니다.

코드 예시

setDimAmount(0f) 사용 예:

val window = (LocalView.current.parent as DialogWindowProvider).window
window.setDimAmount(0f) // Dim 레이어를 완전히 투명하게 만듭니다

clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) 사용 예:

val window = (LocalView.current.parent as DialogWindowProvider).window
window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) // Dim 레이어를 완전히 제거합니다.

시각적 차이

  1. setDimAmount(0f):
    • Dim 레이어는 투명하지만 상태바 영역도 포함되어 영향을 받음.
      • ✅ 강도 조절 가능.
      • ❌ 상태바가 여전히 흐릿해질 가능성 있음(강도가 0이 아닐 경우).
  2. clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND):
    • Dim 레이어가 생성되지 않아 상태바와 배경이 완전히 독립적.
      • ✅ 상태바는 항상 영향을 받지 않음.
      • ❌ Dim 효과는 불가능.

핵심 요약

  • setDimAmount(0f):
    • Dim 강도를 동적으로 조절하고 싶을 때 사용.
    • 상태바에 영향을 주지 않으려면 추가 플래그(예: FLAG_FULLSCREEN 제거) 설정 필요.
  • clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND):
    • Dim 효과를 완전히 제거하고 싶을 때 사용.
    • 상태바와 시스템 UI를 항상 유지하고 싶을 때 적합.
반응형