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">
총결산
몰입 식 효과 의 실현 방식 은 여기까지 입 니 다.이 글 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 셔 도 됩 니 다.

좋은 웹페이지 즐겨찾기