program story

SystemWindows에 정확히 맞는 것은 무엇입니까?

inputbox 2020. 7. 29. 08:11
반응형

SystemWindows에 정확히 맞는 것은 무엇입니까?


나는 fitsSystemWindows그것이 다른 일을한다는 관점에 따라 개념을 이해하기 위해 고심 하고 있습니다. 공식 문서에 따르면

상태 표시 줄과 같은 시스템 창을 기반으로 뷰 레이아웃을 조정하는 부울 내부 속성입니다. true 인 경우이보기의 패딩을 조정 하여 시스템 창을위한 공간을 확보하십시오 .

이제 View.java클래스를 확인 하면로 설정 true하면 창 삽입물 (상태 표시 줄, 탐색 표시 줄 ...)이 뷰 패딩에 적용되며 위에서 인용 한 문서에 따라 작동합니다. 이것은 코드의 관련 부분입니다.

private boolean fitSystemWindowsInt(Rect insets) {
    if ((mViewFlags & FITS_SYSTEM_WINDOWS) == FITS_SYSTEM_WINDOWS) {
        mUserPaddingStart = UNDEFINED_PADDING;
        mUserPaddingEnd = UNDEFINED_PADDING;
        Rect localInsets = sThreadLocal.get();
        if (localInsets == null) {
            localInsets = new Rect();
            sThreadLocal.set(localInsets);
        }
        boolean res = computeFitSystemWindows(insets, localInsets);
        mUserPaddingLeftInitial = localInsets.left;
        mUserPaddingRightInitial = localInsets.right;
        internalSetPadding(localInsets.left, localInsets.top,
                localInsets.right, localInsets.bottom);
        return res;
    }
    return false;
}

새로운 머티리얼 디자인에는이 플래그를 광범위하게 사용하는 새로운 클래스가 있으며 여기에 혼동이 생깁니다. 많은 소스 fitsSystemWindows에서 시스템 막대 뒤에 뷰를 배치하도록 설정하는 플래그로 언급됩니다. 여기를 참조 하십시오 .

에 대한 설명서는 다음 ViewCompat.javasetFitsSystemWindows같이 말합니다.

이 뷰가 상태 표시 줄과 같은 시스템 화면 장식을 설명하고 내용을 삽입해야하는지 여부를 설정합니다. 즉, {@link View # fitSystemWindows (Rect)}의 기본 구현을 실행할지 여부를 제어합니다. 자세한 내용은 해당 방법을 참조하십시오 .

이것에 따르면, fitsSystemWindows단순히 기능 fitsSystemWindows()이 실행 된다는 것을 의미 합니까? 새로운 머티리얼 클래스는 상태 바 아래에서 그리기 위해 이것을 사용하는 것 같습니다. DrawerLayout.java의 코드를 보면 다음을 볼 수 있습니다.

if (ViewCompat.getFitsSystemWindows(this)) {
        IMPL.configureApplyInsets(this);
        mStatusBarBackground = IMPL.getDefaultStatusBarBackground(context);
    }

...

public static void configureApplyInsets(View drawerLayout) {
    if (drawerLayout instanceof DrawerLayoutImpl) {
        drawerLayout.setOnApplyWindowInsetsListener(new InsetsListener());
        drawerLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    }
}

그리고 우리는 새로운 CoordinatorLayout또는 에서 동일한 패턴을 봅니다 AppBarLayout.

이 문서와 정확히 반대의 방식으로 작동하지 fitsSystemWindows않습니까? 마지막 경우 에는 시스템 막대 뒤에 그려야 함을 의미 합니다 .

그러나 FrameLayout상태 표시 줄 뒤에 자체를 그리 려면 fitsSystemWindows기본 구현이 처음에 문서화 된 작업을 수행하므로 true로 설정 하면 트릭이 수행되지 않습니다. 이를 무시하고 언급 된 다른 클래스와 동일한 플래그를 추가해야합니다. 뭔가 빠졌습니까?


시스템 창은 시스템이 비 대화식 (상태 표시 줄의 경우) 또는 대화식 (탐색 표시 줄의 경우) 컨텐츠를 그리는 화면의 일부입니다.

대부분의 경우 앱은 상태 표시 줄이나 탐색 표시 줄 아래에 그릴 필요가 없지만 그렇게하면 버튼과 같은 대화 형 요소가 그 아래에 숨겨져 있지 않아야합니다. 이것이 android : fitsSystemWindows =“true”속성의 기본 동작입니다. 내용이 시스템 창에 겹치지 않도록보기의 패딩을 설정합니다.

https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec


시스템 막대 뒤에 그려지지 않고 같은 색상으로 색조를 지정하기 위해 막대 뒤에 뻗어 있지만 포함 된보기는 상태 표시 줄 안에 채워집니다.

참고URL : https://stackoverflow.com/questions/31761046/what-exactly-does-fitssystemwindows-do

반응형