
안드로이드 애플리케이션 개발에서 윈도우매니저를 활용하여 특정 뷰 또는 윈도우를 화면의 최상단에 위치시키는 방법에 대해 정리 해 두고자 한다.
이 기능은 다양한 상황에서 유용하게 사용될 수 있으며, 특히 사용자와의 인터랙션이 중요한 앱을 개발할 때 필수적인 요소가 될 수 있다.
WindowManager란?
WindowManager는 안드로이드 시스템에서 윈도우(액티비티, 다이얼로그 등)를 관리하는 역할을 한다.
이를 통해 애플리케이션은 이 서비스를 사용하여 애플리케이션은 윈도우를 생성하고 윈도우의 크기, 위치, 표시 방식 등을 조정할 수 있게 되며, 윈도우를 화면에 추가하거나 제거할 수 있다.
WindowManager는 주로 다음과 같은 작업을 수행하는 데 사용된다.
- 윈도우 추가: 애플리케이션은 WindowManager를 사용하여 새로운 윈도우를 시스템에 추가할 수 있다.
이는 주로 팝업 윈도우, 토스트 메시지, 시스템 알림과 같은 사용자 인터페이스 요소를 화면에 표시할 때 사용된다. - 윈도우 제거: WindowManager를 사용하여 이전에 추가된 윈도우를 화면에서 제거할 수 있다.
- 윈도우 속성 변경: 윈도우의 크기, 위치, 투명도와 같은 다양한 속성을 동적으로 변경할 수 있다.
예를 들어, WindowManager를 사용하여 드래그하여 이동할 수 있는 플로팅 윈도우를 구현할 수 있다.
윈도우 위치를 최상단으로 설정하기
WindowManager를 사용하기 위해서는, Context 객체를 통해 WINDOW_SERVICE 상수를 사용하여 인스턴스를 얻어야 한다.
WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
윈도우를 추가할 때는 WindowManager.LayoutParams를 사용하여 윈도우의 속성을 정의해야 한다.
다음은 윈도우를 화면의 최상단에 위치시키는 예제 코드이다.
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, // API 레벨에 따라 TYPE_SYSTEM_ALERT 등을 사용할 수도 있습니다.
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, // 윈도우가 포커스를 가져오지 않도록 설정
PixelFormat.TRANSLUCENT);
// 윈도우의 초기 위치 설정
params.gravity = Gravity.START | Gravity.TOP;
params.x = 0;
params.y = 100;
// 윈도우(예: 사용자 정의 뷰) 추가
windowManager.addView(myCustomView, params);
- MATCH_PARENT를 사용하여 윈도우의 너비와 높이를 화면 크기에 맞춘다.
이는 오버레이가 전체 화면을 커버할 필요가 있을 때 유용하다. - FLAG_NOT_FOCUSABLE 플래그는 윈도우가 키 입력 포커스를 받지 않도록 설정한다.
따라서, 오버레이 뒤에 있는 애플리케이션은 여전히 사용자의 입력을 받을 수 있다. - FLAG_WATCH_OUTSIDE_TOUCH 플래그는 윈도우 밖의 터치 이벤트를 감지할 수 있게 한다.
이는 오버레이가 활성 상태일 때도 사용자가 다른 앱과 상호작용할 수 있게 해준다. - layoutParams.gravity를 Gravity.START | Gravity.TOP으로 설정하여, 윈도우를 화면의 상단 시작점에 위치시킨다.
이는 오버레이의 위치를 화면의 특정 위치에 고정시킬 때 유용하다.
TYPE_APPLICATION_OVERLAY 윈도우 타입의 사용은 사용자의 명시적인 허가가 필요하며, 이를 위해서는 애플리케이션의 매니페스트 파일에 SYSTEM_ALERT_WINDOW 권한을 요청해야 한다.
사용자가 이 권한을 승인해야만 애플리케이션이 오버레이를 화면에 표시할 수 있다.
참고 : https://developer.android.com/reference/android/view/WindowManager.LayoutParams#FLAG_NOT_FOCUSABLE