SlideShare a Scribd company logo
1 of 97
Download to read offline
안드로이드 윈도우
마스터되기
Speaker.안명욱
Window 란?
Window Fitting의 필요성
버전별 윈도우 프레임워크
Window Fitting 방식
fitSystemWindows 방식
Manual Handling 방식
잘못 사용한 방식들
WindowInsets 사용하기
Display Cutout
목차
Window 란?
Window란?

Window Fit의 필요성

버전별 윈도우 프레임워크

Window Fit 방식

fitSystemWindows 방식 

Manual Handling 방식

잘못 사용한 방식들

WindowInsets 사용하기

Display Cutout
Window
모든 UI는 윈도우 안에 있음
Key Handling
Window Decor
Activity는 Window를 내부적으로 가짐
Activity#getWindow()
Window
Dialog도 Window를 가짐
Dialog#getWindow()
Window
Window Fitting의 필요성
Window란?

Window Fit의 필요성

버전별 윈도우 프레임워크

Window Fit 방식

fitSystemWindows 방식 

Manual Handling 방식

잘못 사용한 방식들

WindowInsets 사용하기

Display Cutout
우리가 원하는 레이아웃을 구성하기 위하여,
윈도우와 우리 뷰를 적절히 설정하기
Window Fitting
창틀에 유리 끼우기
버전별 Window의 변
화 Window란?

Window Fit의 필요성

버전별 윈도우 프레임워크

Window Fit 방식

fitSystemWindows 방식 

Manual Handling 방식

잘못 사용한 방식들

WindowInsets 사용하기

Display Cutout
Jelly Bean과 그 이전 세대
Window는 시스템바들 사이에 위치
Jelly Bean과 그 이전 세대
setSystemUiVisiblity()
SYSTEM_UI_FLAG_LOW_PROFILE

SYSTEM_UI_FLAG_HIDE_NAVIGATION

SYSTEM_UI_FLAG_FULLSCREEN

SYSTEM_UI_FLAG_VISIBLE
SYSTEM_UI_FLAG_IMMERSIVE_STICKY

SYSTEM_UI_FLAG_IMMERSIVE
SYSTEM_UI_FLAG_LIGHT_STATUS_BAR

SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
SYSTEM_UI_FLAG_LAYOUT_STABLE

SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
SYSTEM_UI_FLAG_LOW_PROFILE

SYSTEM_UI_FLAG_HIDE_NAVIGATION

SYSTEM_UI_FLAG_FULLSCREEN

SYSTEM_UI_FLAG_VISIBLE
SYSTEM_UI_FLAG_IMMERSIVE_STICKY

SYSTEM_UI_FLAG_IMMERSIVE
SYSTEM_UI_FLAG_LIGHT_STATUS_BAR

SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
SYSTEM_UI_FLAG_LAYOUT_STABLE

SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
Window Transform Flags(윈도우 변환 플래그)
WTF
myView.systemUiVisiblity =
View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
KitKat
KitKat
반투명 시스템 바
내부적으로 WTF가 사용됨
Lollipop
Lollipop
android:windowDrawsSystemBarBackgrounds

시스템바 백그라운드가
우리 윈도우 안에 위치 함
android:navigationBarColor
getWindow().setNavigationBarColor()
android:statusBarColor
getWindow().setStatusBarColor()
Lollipop
반투명 시스템 바
android:windowTranslucentStatus=“true”
android:windowTranslucentNavigation=“true”
어떤 커스텀 컬러보다 우선시 함
windowDrawsSystemBarBackgrounds

를 비활성하게 됨
Window Fit 방식
: fitSystemWindowsWindow란?

Window Fit의 필요성

버전별 윈도우 프레임워크

Window Fit 방식

fitSystemWindows 방식 

Manual Handling 방식

잘못 사용한 방식들

WindowInsets 사용하기

Display Cutout
android:fitSystemWindows=“true"
View.java의 기본동작:
Padding을 추가하여 Insets 안으로
Child View들를 이동시킨다.
android:fitSystemWindows=“true"
systemUiVisibility =
View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
android:fitSystemWindows=“true"
Padding
Padding
systemUiVisibility =
View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
android:fitSystemWindows=“true"
android:fitSystemWindows=“true"
systemUiVisibility =
View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
android:fitSystemWindows=“true"
DrawerLayout
CoordinatorLayout
AppBarLayout
CollapsingToolbarLayout
View는 Padding을 추가하여 Child View를
Inset 안으로 이동시킨다.
몇몇 View Class에서는 다르게 동작한다.
DrawerLayout
API 21+에서는 WTF를 설정해줌
android:fitSystemWindows=“true"
DrawerLayout
fitSystemWindows를
자식뷰들로부터의 신호로 사용
API 21+에서는 WTF를 설정해줌
android:fitSystemWindows=“true"
android:fitSystemWindows=“true"
DrawerLayout
CoordinatorLayout
AppBarLayout
CollapsingToolbarLayout
일반적으로는 View에 Padding을 추가하여 Child View를
Inset 안으로 이동시켜, 시스템UI와 겹치지 않도록 해준다.
몇몇 View Class에서는 fitSystemWindows를 오버라이
드 하여 다른 동작을 한다.
WTF를 자동으로 설정하여,시스템
UI 뒷편으로 Draw가 가능하게 해준
다.
자식뷰에서는 부모뷰따라 확장하기 위
한 신호로 사용된다.
Window Fit 방식
: Manual HandlingWindow란?

Window Fit의 필요성

버전별 윈도우 프레임워크

Window Fit 방식

fitSystemWindows 방식 

Manual Handling 방식

잘못 사용한 방식들

WindowInsets 사용하기

Display Cutout
Window Manual Fit
: 잘못 사용한 방식들Window란?

Window Fit의 필요성

버전별 윈도우 프레임워크

Window Fit 방식

fitSystemWindows 방식 

Manual Handling 방식

잘못 사용한 방식들

WindowInsets 사용하기

Display Cutout
Status bar의 높이값을 임의로 지정하기
Status bar의 사이드가 변경된다면?
Status bar 사이즈가 다른 디바이스에서
는?
24dp
48dp
Internal system resource 값에서 가져
오기
frameworks/base/core/res/values/dimens.xml
Internal resource의 이름이 변경된다
면?
Status bar뒷편의 draw를
막는 디바이스가 있다면?
Window Manual Fit
: WindowInsets을 사용하자Window란?

Window Fit의 필요성

버전별 윈도우 프레임워크

Window Fit 방식

fitSystemWindows 방식 

Manual Handling 방식

잘못 사용한 방식들

WindowInsets 사용하기

Display Cutout
안드로이드 시스템에서
시스템 UI가 어디에 위치해있는지,
혹은 나중에 보여지게 될지를 안내해주는 역
할
WindowInsets
getSystemWindowInsetLeft()
getSystemWindowInsetTop()
getSystemWindowInsetRight()
getSystemWindowInsetBottom()
getDisplayCutout()
WindowInsetsCompat
getSystemWindowInsetLeft()
getSystemWindowInsetTop()
getSystemWindowInsetRight()
getSystemWindowInsetBottom()
0
74
0
126
Left()
Top()
Right()
Bottom()
0
74
126
0
WindowInsets은 완전히
소비(Consume) 될때까지 전달
된다.
Window Decor
LinearLayout
Child Child
dispatchApplyWindowInsets()
Window Decor
LinearLayout
Child Child
dispatchApplyWindowInsets()
0
63
0
126
Left :
Top :
Right :
Bottom :
onApplyWindowInsets()
LinearLayout
Window Decor
Child Child
0
0
0
126
Left :
Top :
Right :
Bottom :
onApplyWindowInsets()
consumeSystemWindowInsets

(left, top, right, bottom)
WindowInsets.isConsumed()
false
0
63
0
126
LinearLayout
Child
Window Decor
Child
0
0
0
126
Left :
Top :
Right :
Bottom :
dispatchApplyWindowInsets()
onApplyWindowInsets()
WindowInsets.isConsumed()
false
Child
Window Decor
0
0
0
Left :
Top :
Right :
Bottom :
dispatchApplyWindowInsets()
onApplyWindowInsets()
WindowInsets.isConsumed()
true
1260
Child
LinearLayout
consumeSystemWindowInsets

(left, top, right, bottom)
Display Cutout
Window란?

Window Fit의 필요성

버전별 윈도우 프레임워크

Window Fit 방식

fitSystemWindows 방식 

Manual Handling 방식

잘못 사용한 방식들

WindowInsets 사용하기

Display Cutout
android:windowLayoutInDisplayCutoutMode
never | default | shortEdges

window.attributes.layoutInDisplayCutoutMode =
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
NEVER
윈도우는 DisplayCutout 영역에

절대로 오버래핑하지 못함
DEFAULT
윈도우가 DisplayCutout 영역까지 확장 허용
단, DisplayCutout이 System bar 영역에

완전히 포함되어 있는 경우에만
DEFAULT
윈도우가 DisplayCutout 영역까지 확장 허용
단, DisplayCutout이 System bar 영역에

완전히 포함되어 있는 경우에만
Landscape 모드에서는 letterbox 발생
SHORTEDGES
윈도우가 Cutout 영역으로 확장하는 것을

항상 허용
우리 앱의 Content의 중요한 부분이

Cutout 영역과 겹지 않도록 하는 것은

개발자의 몫
getSafeInsetLeft()
getSafeInsetTop()
getSafeInsetRight()
getSafeInsetBottom()
getBoundingRects()
DisplayCutout
getSafeInsetLeft()
getSafeInsetTop()
getSafeInsetRight()
getSafeInsetBottom()
getBoundingRects()
TOP
0
126
0
0
getSafeInsetLeft()
getSafeInsetTop()
getSafeInsetRight()
getSafeInsetBottom()
getBoundingRects()

RECT(414,0-666,126)
더블 디스플레이 

컷아웃
갤럭시S10

모서리 디스플레이 컷아웃
픽셀3
감사합니다.
chapi79@gmail.com
Reference
Chris Banes의 Becoming a master window fitter

https://chris.banes.me/talks/2017/becoming-a-master-window-fitter-nyc/

https://medium.com/androiddevelopers/windows-insets-fragment-
transitions-9024b239a436
WindowInsets

https://medium.com/@azizbekian/windowinsets-24e241d4afb9

https://developer.android.com/reference/android/view/WindowInsets

https://stackoverflow.com/questions/33585225/what-are-windowinsets
Display Cutout

https://developer.android.com/guide/topics/display-cutout

https://developer.android.com/reference/android/view/
WindowManager.LayoutParams

More Related Content

What's hot

리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션QooJuice
 
win32 app에서 UWP API호출하기
win32 app에서 UWP API호출하기win32 app에서 UWP API호출하기
win32 app에서 UWP API호출하기YEONG-CHEON YOU
 
공간정보아카데미 - Day1 오픈소스개발 일반
공간정보아카데미 - Day1 오픈소스개발 일반공간정보아카데미 - Day1 오픈소스개발 일반
공간정보아카데미 - Day1 오픈소스개발 일반BJ Jang
 
Advanced Scenegraph Rendering Pipeline
Advanced Scenegraph Rendering PipelineAdvanced Scenegraph Rendering Pipeline
Advanced Scenegraph Rendering PipelineNarann29
 
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기Yongha Kim
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들영욱 오
 
[22]Efficient and Testable MVVM pattern
[22]Efficient and Testable MVVM pattern[22]Efficient and Testable MVVM pattern
[22]Efficient and Testable MVVM patternNAVER Engineering
 
[FOSS4G Korea 2021]Workshop-QGIS-TIPS-20211028
[FOSS4G Korea 2021]Workshop-QGIS-TIPS-20211028[FOSS4G Korea 2021]Workshop-QGIS-TIPS-20211028
[FOSS4G Korea 2021]Workshop-QGIS-TIPS-20211028MinPa Lee
 
State of OpenGXT: 오픈소스 공간분석엔진
State of OpenGXT: 오픈소스 공간분석엔진State of OpenGXT: 오픈소스 공간분석엔진
State of OpenGXT: 오픈소스 공간분석엔진MinPa Lee
 
정보보호통합플랫폼 기술 트렌드
정보보호통합플랫폼 기술 트렌드정보보호통합플랫폼 기술 트렌드
정보보호통합플랫폼 기술 트렌드Logpresso
 
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리MinGeun Park
 
코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes
코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes
코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked ChangesJiyeon Seo
 
Gitlab flow solo
Gitlab flow soloGitlab flow solo
Gitlab flow soloviniciusban
 
svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드Insub Lee
 
Unity Internals: Memory and Performance
Unity Internals: Memory and PerformanceUnity Internals: Memory and Performance
Unity Internals: Memory and PerformanceDevGAMM Conference
 
지금은 Constraint layout 시대
지금은 Constraint layout 시대지금은 Constraint layout 시대
지금은 Constraint layout 시대Sewon Ann
 
GDC 2014 - Deformable Snow Rendering in Batman: Arkham Origins
GDC 2014 - Deformable Snow Rendering in Batman: Arkham OriginsGDC 2014 - Deformable Snow Rendering in Batman: Arkham Origins
GDC 2014 - Deformable Snow Rendering in Batman: Arkham OriginsColin Barré-Brisebois
 
[공간정보연구원] 1일차 - 오픈소스GIS 개요
[공간정보연구원] 1일차 - 오픈소스GIS 개요[공간정보연구원] 1일차 - 오픈소스GIS 개요
[공간정보연구원] 1일차 - 오픈소스GIS 개요slhead1
 

What's hot (20)

리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션
 
win32 app에서 UWP API호출하기
win32 app에서 UWP API호출하기win32 app에서 UWP API호출하기
win32 app에서 UWP API호출하기
 
공간정보아카데미 - Day1 오픈소스개발 일반
공간정보아카데미 - Day1 오픈소스개발 일반공간정보아카데미 - Day1 오픈소스개발 일반
공간정보아카데미 - Day1 오픈소스개발 일반
 
Advanced Scenegraph Rendering Pipeline
Advanced Scenegraph Rendering PipelineAdvanced Scenegraph Rendering Pipeline
Advanced Scenegraph Rendering Pipeline
 
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
 
[22]Efficient and Testable MVVM pattern
[22]Efficient and Testable MVVM pattern[22]Efficient and Testable MVVM pattern
[22]Efficient and Testable MVVM pattern
 
[FOSS4G Korea 2021]Workshop-QGIS-TIPS-20211028
[FOSS4G Korea 2021]Workshop-QGIS-TIPS-20211028[FOSS4G Korea 2021]Workshop-QGIS-TIPS-20211028
[FOSS4G Korea 2021]Workshop-QGIS-TIPS-20211028
 
State of OpenGXT: 오픈소스 공간분석엔진
State of OpenGXT: 오픈소스 공간분석엔진State of OpenGXT: 오픈소스 공간분석엔진
State of OpenGXT: 오픈소스 공간분석엔진
 
정보보호통합플랫폼 기술 트렌드
정보보호통합플랫폼 기술 트렌드정보보호통합플랫폼 기술 트렌드
정보보호통합플랫폼 기술 트렌드
 
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
 
코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes
코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes
코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes
 
Gitlab flow solo
Gitlab flow soloGitlab flow solo
Gitlab flow solo
 
svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드
 
Unity Internals: Memory and Performance
Unity Internals: Memory and PerformanceUnity Internals: Memory and Performance
Unity Internals: Memory and Performance
 
지금은 Constraint layout 시대
지금은 Constraint layout 시대지금은 Constraint layout 시대
지금은 Constraint layout 시대
 
GDC 2014 - Deformable Snow Rendering in Batman: Arkham Origins
GDC 2014 - Deformable Snow Rendering in Batman: Arkham OriginsGDC 2014 - Deformable Snow Rendering in Batman: Arkham Origins
GDC 2014 - Deformable Snow Rendering in Batman: Arkham Origins
 
Gitlab flow
Gitlab flowGitlab flow
Gitlab flow
 
[공간정보연구원] 1일차 - 오픈소스GIS 개요
[공간정보연구원] 1일차 - 오픈소스GIS 개요[공간정보연구원] 1일차 - 오픈소스GIS 개요
[공간정보연구원] 1일차 - 오픈소스GIS 개요
 
GeoServer 기초
GeoServer 기초GeoServer 기초
GeoServer 기초
 

Similar to 안드로이드 윈도우 마스터 되기

[안드앱콘] 1.다양한스크린사이즈
[안드앱콘] 1.다양한스크린사이즈[안드앱콘] 1.다양한스크린사이즈
[안드앱콘] 1.다양한스크린사이즈Neoroid
 
Touch Ux With Win32
Touch Ux With Win32Touch Ux With Win32
Touch Ux With Win32sung ki choi
 
webdynpro Wda Select Option Usage
webdynpro Wda Select Option Usagewebdynpro Wda Select Option Usage
webdynpro Wda Select Option Usagejung_se_hun
 
[NEXT] Android 개발 경험 프로젝트 1일차 (Widget, Linear Layout)
[NEXT] Android  개발 경험 프로젝트 1일차 (Widget, Linear Layout) [NEXT] Android  개발 경험 프로젝트 1일차 (Widget, Linear Layout)
[NEXT] Android 개발 경험 프로젝트 1일차 (Widget, Linear Layout) YoungSu Son
 
Windows Debugging Technique #3
Windows Debugging Technique #3Windows Debugging Technique #3
Windows Debugging Technique #3Wooseok Seo
 
다양한 모바일에서의 호환성 보장과 사이즈 지원 방법
다양한 모바일에서의 호환성 보장과 사이즈 지원 방법다양한 모바일에서의 호환성 보장과 사이즈 지원 방법
다양한 모바일에서의 호환성 보장과 사이즈 지원 방법mosaicnet
 
One click recovery_application-특허_및_제품_조사
One click recovery_application-특허_및_제품_조사One click recovery_application-특허_및_제품_조사
One click recovery_application-특허_및_제품_조사호상 장
 

Similar to 안드로이드 윈도우 마스터 되기 (7)

[안드앱콘] 1.다양한스크린사이즈
[안드앱콘] 1.다양한스크린사이즈[안드앱콘] 1.다양한스크린사이즈
[안드앱콘] 1.다양한스크린사이즈
 
Touch Ux With Win32
Touch Ux With Win32Touch Ux With Win32
Touch Ux With Win32
 
webdynpro Wda Select Option Usage
webdynpro Wda Select Option Usagewebdynpro Wda Select Option Usage
webdynpro Wda Select Option Usage
 
[NEXT] Android 개발 경험 프로젝트 1일차 (Widget, Linear Layout)
[NEXT] Android  개발 경험 프로젝트 1일차 (Widget, Linear Layout) [NEXT] Android  개발 경험 프로젝트 1일차 (Widget, Linear Layout)
[NEXT] Android 개발 경험 프로젝트 1일차 (Widget, Linear Layout)
 
Windows Debugging Technique #3
Windows Debugging Technique #3Windows Debugging Technique #3
Windows Debugging Technique #3
 
다양한 모바일에서의 호환성 보장과 사이즈 지원 방법
다양한 모바일에서의 호환성 보장과 사이즈 지원 방법다양한 모바일에서의 호환성 보장과 사이즈 지원 방법
다양한 모바일에서의 호환성 보장과 사이즈 지원 방법
 
One click recovery_application-특허_및_제품_조사
One click recovery_application-특허_및_제품_조사One click recovery_application-특허_및_제품_조사
One click recovery_application-특허_및_제품_조사
 

안드로이드 윈도우 마스터 되기