Android 4.4 이상"몰입 식"상태 표시 줄 효과 구현 방법
몰입 식 상태 표시 줄 의 뜻 은 상태 표시 줄 의 색 이 소프트웨어 색 에 따라 바 뀌 어 상태 표시 줄 과 소프트웨어 색 을 일치 시 키 고 몰입 하 는 것 을 말 합 니 다!프로그램 을 열 때,프로그램 과 상태 표시 줄 의 검 은 테두리 가 분리 되 어 있다 고 해서 더 이상 보기 흉 하지 않 습 니 다.몰입 식 상태 표시 줄 은 사용자 단체 에 좋 은 사용자 체험 을 가 져 다 줄 수 있 기 때문에 점점 더 많은 응용 에서 구현 되 었 다.
실현 원리
4.4 이후 시스템 에 투명 상태 표시 줄 의 특성
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
이 추가 되면 레이아웃 의 내용DecorView
이 상태 표시 줄 에 자동 으로 채 워 집 니 다.모든 구현 은 이 기능 을 기반 으로 합 니 다.이 럴 때 상태 표시 줄 이 기본적으로 비어 있 는 것 과 같 습 니 다.그리고 개발 자 는 view 를 사용자 정의 하여 이 높이 를 채 울 수 있 습 니 다.실현 하 는 과정 에서
android:fitsSystemWindows="true"
도 사용 해 야 할 수 있 는데 이 속성 은 매우 중요 하 다.그 의미:view 는 시스템 창(예 를 들 어 status bar,소프트 키보드)에 따라 자신의 레이아웃 을 조정 할 수 있 습 니 다.값 이 true 이면 view 의paingding
속성 을 조정 하여 system windows 에 공간 을 남 길 수 있 습 니 다.그러면 이제 구체 적 인 실현 방식 을 살 펴 보도 록 하 겠 습 니 다.
일반 페이지 는 클래스 제목 표시 줄 을 스스로 정의 합 니 다.
이루어지다
실현 효과 에 있어 서 여 기 는 크게 두 가지 로 나 뉜 다.
1.상태 표시 줄 에 단독으로 착색
이 오픈 소스 라 이브 러 리 사용
SystemBarTint
/**
*
* @param context
* @param color
*/
public static void smartTintManager(Activity context, int color){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = context.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//
SystemBarTintManager tintManager = new SystemBarTintManager(context);
//
tintManager.setStatusBarTintEnabled(true);
tintManager.setStatusBarTintColor(color);
}
}
대응 하 는 페이지 의 루트 레이아웃 에 추가android:fitsSystemWindows="true"
하고 루트 레이아웃 에 전체적인 배경 색 을 설정 할 수 없습니다.그렇지 않 으 면 상태 표시 줄 착색 이 덮어 집 니 다.위의 방법 으로 구체 적 인 색 을 설정 합 니 다.(소스 라 이브 러 리 에 따라 하나의 핵심 클래스 에 있 습 니 다.그 종 류 를 프로젝트 에 직접 복사 할 수 있 습 니 다)
여기 서 구체 적 인 실현 원 리 를 말씀 드 리 겠 습 니 다.
private void setupStatusBarView(Context context, ViewGroup decorViewGroup) {
mStatusBarTintView = new View(context);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, mConfig.getStatusBarHeight());
params.gravity = Gravity.TOP;
if (mNavBarAvailable && !mConfig.isNavigationAtBottom()) {
params.rightMargin = mConfig.getNavigationBarWidth();
}
mStatusBarTintView.setLayoutParams(params);
mStatusBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);
mStatusBarTintView.setVisibility(View.GONE);
decorViewGroup.addView(mStatusBarTintView);
}
이 코드 를 통 해 알 수 있 듯 이 동적 으로 view 를 생 성 한 다음 에 이 view 폭 은MATCH_PARENT
이 고 높이 는 시스템 상태 표시 줄 의 높이 이다.그리고 이 동적 으로 생 성 된 view 에 배경 색 을 설정 합 니 다.마지막 으로 이 view 를decorViewGroup
이 view 용기 에 추가 합 니 다.이 view 가 누구 인지 다시 봅 시다.
/**
* Constructor. Call this in the host activity onCreate method after its
* content view has been set. You should always create new instances when
* the host activity is recreated.
*
* @param activity The host activity.
*/
@TargetApi(19)
public SystemBarTintManager(Activity activity) {
Window win = activity.getWindow();
// DecorView
ViewGroup decorViewGroup = (ViewGroup) win.getDecorView();
.....
if (mStatusBarAvailable) {
// view decorViewGroup
setupStatusBarView(activity, decorViewGroup);
}
if (mNavBarAvailable) {
setupNavBarView(activity, decorViewGroup);
}
}
위의 두 개의 내 가 수 동 으로 추가 한 주석 을 주의해 서 보면 이런 방법 사상 은 상태 표시 줄 이 투명 한 후에 루트 레이아웃decorViewGroup
에 하나 와 상태 표시 줄 등 높이 의 view 를 추가 하 는 것 이다.네가 이 view 를 무슨 색 으로 만 들 었 는 지 에 대해 서 는 네 마음대로 해라.2.제목 표시 줄 배경 색 으로 상태 표시 줄 채 우기
상태 표시 줄 을 반투명 으로 설정 하면 다음 내용 이 상태 표시 줄 을 차지 하 는 문제 가 발생 합 니 다.
만약 우리 가 activity 의 루트 레이아웃 에 추가 하면
android:fitsSystemWindows="true"
그렇다면 이때 상태 표시 줄 은 볼 수 있 고 차지 하지 않 았 다.그럼 이 속성의 역할 은 여기 있 습 니 다.이때 우 리 는 상태 표시 줄 의 높이 를 빌려 아래 내용 에
padding-top
거 리 를 설정 합 니 다.(상태 표시 줄 이 반투명 하면 아래 내용 이 원래 의 상태 표시 줄 을 차지 하기 때문에padding
상태 표시 줄 높이 를 설정 하면 됩 니 다)이렇게 설정 한 후에 이 view 배경padding
에서 원래 의 상태 표시 줄 높이 는 같은 배경 색 을 채 웁 니 다.그러면 이렇게 하면 몰입 식 이 라 고 하 는 것 같 아 요.이런 식 으로 말하자면 상태 표시 줄 이 반투명 한 후에 아래 내용 으로 적당 하 게 채 우 는 것 이다.(기본 반투명 이 차지 하기 때문이다)
코드 는 다음 과 같 습 니 다:
@SuppressLint("InlinedApi")
public static void setImmerseLayout(Activity context, View view) {
if (context == null || view == null) {
return;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = context.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
int statusBarHeight = getStatusBarHeight(context.getBaseContext());
view.setPadding(0, statusBarHeight, 0, 0);
}
}
/**
* 。 Resource ( )
*
* @return 。
*/
public static int getStatusBarHeight(Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
이 view 에padding_top
를 설정 합 니 다.이padding
의 거 리 는 상태 표시 줄 의 높이 입 니 다.그러면 이 view 의 배경 은 상태 표시 줄 로 채 워 집 니 다.주의해 야 할 것 은 이 제목 표시 줄 의 높이 는 반드시
wrap_content
이 어야 한 다 는 것 이다.구체 적 인 높이 라면 개paddingtop
를 설정 하면 일부 제목 표시 줄 의 내용 을 밀어 내 고 완전 하지 않 기 때문이다.따라서 일반적인 방법 은 기 존의 제목 표시 줄 밖 에 하나
<FrameLayout />
를 끼 워 넣 은 다음 제목 표시 줄 배경 을<FrameLayout />
배경 색 으로 설정 하 는 것 이다.
<FrameLayout
android:id="@+id/title"
android:layout_width="match_parent"
android:background="@color/common_theme_color"
android:layout_height="wrap_content">
총결산몰입 식 효과 의 실현 방식 은 여기까지 입 니 다.이 글 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 셔 도 됩 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.