본문 바로가기
Android

[Android] 안드로이드에서 WindowManager를 활용하여 윈도우 위치 최상단으로 설정하기

by quessr 2024. 4. 4.

 

안드로이드 애플리케이션 개발에서 윈도우매니저를 활용하여 특정 뷰 또는 윈도우를 화면의 최상단에 위치시키는 방법에 대해 정리 해 두고자 한다.
이 기능은 다양한 상황에서 유용하게 사용될 수 있으며, 특히 사용자와의 인터랙션이 중요한 앱을 개발할 때 필수적인 요소가 될 수 있다.

 

WindowManager란?

WindowManager는 안드로이드 시스템에서 윈도우(액티비티, 다이얼로그 등)를 관리하는 역할을 한다.

이를 통해 애플리케이션은 이 서비스를 사용하여 애플리케이션은 윈도우를 생성하고 윈도우의 크기, 위치, 표시 방식 등을 조정할 수 있게 되며, 윈도우를 화면에 추가하거나 제거할  있다.

 

WindowManager는 주로 다음과 같은 작업을 수행하는 데 사용된다.

  1. 윈도우 추가: 애플리케이션은 WindowManager 사용하여 새로운 윈도우를 시스템에 추가할 있다.
    이는 주로 팝업 윈도우, 토스트 메시지, 시스템 알림과 같은 사용자 인터페이스 요소를 화면에 표시할 사용된다.
  2. 윈도우 제거: WindowManager 사용하여 이전에 추가된 윈도우를 화면에서 제거할 있다.
  3. 윈도우 속성 변경: 윈도우의 크기, 위치, 투명도와 같은 다양한 속성을 동적으로 변경할 있다.
    예를 들어, 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