소곤소곤 ad

2025년 8월 19일 화요일

Android SDK 35 에서 Game View에서 Edge-to-Edge 구현

개발환경 : Android JAVA + libGDX  게임엔진


구글 플레이가 targetSDK 35를 강제하면서, 가장 크게 달라진 점

Edge-To-Edge 구현하면서, 나를 지독하게 괴롭혔던 것


 @Override
public void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R)
WindowCompat.setDecorFitsSystemWindows(getWindow(), true);
else
WindowCompat.setDecorFitsSystemWindows(getWindow(), false);

안드로이드 11, 즉 SDK.VERSION.SDK_INT가 30 (R) 이상인 경우, Edge-To-Edge를 "개발자가 구현"해야 하므로, setDecorFitsSystemWindows() 를   false로 하여야 한다. 


그 이전 버전에서는 OS가 알아서 하게 한다.  네비게이션 패널이 '고정'으로 존재하는 경우 예전버전에서는 그만큼의 영역이 삭제된 픽셀을 앱이 할당받았으나 R 이후에는 전체화면에서 시스템바로 인해 삭제되는 영역에 대한 처리를 개발자가 직접 구현해야 한다. 

일반 어플리케이션은 세심하게 구현하면 되지만, 게임 처럼 전체화면을 렌더링 영역으로 쓰는 경우에는 아주 복잡한 문제에 빠진다. 게임 UI를 시스템바가 가리는 경우가 생기기 때문이다. 

그래서, 아예 시스템바를 코드로 모두 사라지게 하는 방법으로 해결하였다. 

public static void setFull(Activity activity)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // Build.VERSION_CODES.R API 30
final WindowInsetsController insetsController = activity.getWindow().getInsetsController();
if (insetsController != null) {
insetsController.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);

// WindowInsets.Type.systemBars()는 상태 바와 내비게이션 바를 모두 포함합니다.
insetsController.hide(WindowInsets.Type.systemBars());
insetsController.hide(WindowInsets.Type.displayCutout());

//insetsController.hide(WindowInsets.Type.statusBars()); // 상태 바만 숨기기
//insetsController.hide(WindowInsets.Type.navigationBars()); // 내비게이션 바만 숨기기
}
}
}

앱에서 텍스트입력을 받아야 하는 경우는, 키보드 표시가 또 문제가 된다.  입력영역을 키보드가 가려버릴 수 있기 때문에 이벤트 처리함수를 작성해야 한다. 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
sendButtonParams.setMarginEnd(100); // dummy

ViewCompat.setOnApplyWindowInsetsListener(getWindow().getDecorView(), (v, insets) -> {
Insets imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime());
int keyboardHeight = imeInsets.bottom; // 키보드는 하단에 나타나므로 bottom 값을 사용

// 키보드 높이만큼 채팅 레이아웃을 위로 이동
if (mChatLayout != null) {
mChatLayout.setTranslationY(-(float) keyboardHeight);
}
return insets;
});
}
sendButton 의 오른쪽 마진을 둔다. 이 영역에 키보드와 함께 튀어나올 네비게이션바가 위치하게 된다. 이렇게 하지 않으면 네비게이션바가 sendButton을 가려버릴 것이다.  또, 텍스트 입력 Layout의 위치를 조절하여 입력창과 키보드가 모두 보이게 해야 한다. 






댓글 없음:

댓글 쓰기