[android] 롤리팝 : 투명하게 설정된 색상으로 statusBar 뒤에 그리기

테마에서 다음 줄만 사용하여 Lollipop에 대해 statusBar 색상을 투명으로 설정했습니다.

<item name="android:statusBarColor">@android:color/transparent</item>

이제 그 뒤에 그릴 필요가 있지만 그 뒤에는 어떤 견해도 가져올 수 없습니다. windowTranslucentStatus속성으로 사용 하는 방법을 알고 있지만이 속성을 사용하지 않으려면 statusBar의 색상이 투명으로 설정되므로 무시하십시오.



답변

방법 # 1 :

완전히 투명한 상태 표시 줄을 얻으려면 statusBarColorAPI 21 이상에서만 사용할 수 있는을 사용해야 합니다. windowTranslucentStatusAPI 19 이상에서 사용할 수 있지만 상태 표시 줄에 색조 배경을 추가합니다. 그러나 설정 windowTranslucentStatusstatusBarColor투명으로 변경 하지 않고 한 가지를 달성 합니다. SYSTEM_UI_FLAG_LAYOUT_STABLE
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN플래그를 설정합니다 . 동일한 효과를 얻는 가장 쉬운 방법은 이러한 플래그를 수동으로 설정하는 것입니다.이 플래그는 Android 레이아웃 시스템에 의해 부과 된 삽입을 효과적으로 비활성화하고 사용자를 보호합니다.

onCreate메소드 에서이 라인을 호출합니다 .

getWindow().getDecorView().setSystemUiVisibility(
    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

/res/values-v21/styles.xml에서 투명도를 설정해야합니다.

<item name="android:statusBarColor">@android:color/transparent</item>

또는 프로그래밍 방식으로 투명도를 설정하십시오.

getWindow().setStatusBarColor(Color.TRANSPARENT);

이 접근 방식의 좋은 점은 색조가 지정된 반투명 상태 표시 줄의 투명 상태 표시 줄을 교환하여 동일한 레이아웃과 디자인을 API 19에서도 사용할 수 있다는 것입니다.

<item name="android:windowTranslucentStatus">true</item>

방법 # 2 :

상태 표시 줄 아래에보기를 배치하는 대신 배경 이미지 만 페인트해야하는 경우, 활동 테마의 배경을 원하는 이미지로 설정하고 방법 #에 표시된대로 상태 표시 줄 투명도를 설정하면됩니다. 1. 몇 달 전부터 Android Police 기사 의 스크린 샷을 만드는 데 사용한 방법 입니다.

방법 # 3 :

일부 레이아웃의 표준 시스템 삽입을 무시하고 다른 레이아웃에서 작동하도록 유지하려면 유일하게 실행 가능한 방법은 자주 연결된 ScrimInsetsFrameLayout클래스 와 작업하는 것입니다 . 물론, 해당 수업에서 수행 된 일부 작업이 모든 시나리오에 필요한 것은 아닙니다. 예를 들어, 합성 상태 표시 줄 오버레이를 사용 init()하지 않으 려면 메소드의 모든 내용을 주석 처리하고 attrs.xml 파일에 아무것도 추가하지 않아도됩니다. 이 접근 방식이 효과가있는 것을 보았지만이 방법을 사용하면 해결할 수있는 많은 작업이 필요할 수 있습니다.

또한 여러 레이아웃을 래핑하는 것에 반대하는 것을 보았습니다. 하나의 레이아웃을 다른 레이아웃 내부에 배치하는 경우 match_parent높이와 너비 모두에 영향을 미치므로 성능에 대한 걱정은 너무 사소합니다. 어쨌든 확장 클래스 FrameLayout를 원하는 다른 유형의 레이아웃 클래스 로 변경하여 이러한 상황을 완전히 피할 수 있습니다 . 잘 작동합니다.


답변

이것은 내 경우에 효과가 있었다


// Create/Set toolbar as actionbar
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

// Check if the version of Android is Lollipop or higher
if (Build.VERSION.SDK_INT >= 21) {

    // Set the status bar to dark-semi-transparentish
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
            WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

    // Set paddingTop of toolbar to height of status bar.
    // Fixes statusbar covers toolbar issue
    toolbar.setPadding(0, getStatusBarHeight(), 0, 0);
}

// A method to find height of the status bar
public int getStatusBarHeight() {
    int result = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

statusBars 작업에 대한 자세한 내용 : youtube.com/watch?v=_mGDMVRO3iE



답변

이 테마를보십시오

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="colorPrimaryDark">@android:color/transparent</item>
    <item name="colorPrimary">@color/md_blue_200</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
    <item name="android:windowTranslucentStatus">true</item>
</style>

레이아웃이 설정되어 있는지 확인하십시오

android:fitsSystemWindows="false"


답변

대신에

<item name="android:statusBarColor">@android:color/transparent</item>

다음을 사용하십시오.

<item name="android:windowTranslucentStatus">true</item>

‘MainActivity’레이아웃에서 상단 패딩 (기본적으로 추가됨)을 제거해야합니다.

이렇게해도 상태 표시 줄이 완전히 투명 해지지는 않으며 상태 표시 줄 위에 여전히 “흐리게 검은 색”오버레이가 표시됩니다.


답변

Cody Toombs의 솔루션은 거의 나를 위해 속임수를 사용했습니다. 이것이 Xamarin 과 관련 이 있는지 확실 하지 않지만 이제 수용 가능한 해결책이 있습니다.

예

이것은 내 설정입니다.

Android.Support v4 및 v7 패키지를 참조한 Android 프로젝트가 있습니다. 두 가지 스타일이 정의되어 있습니다.

values ​​/ styles.xml :

<?xml version="1.0" encoding="UTF-8" ?>
<resources>
    <style name="MyStyle" parent="@style/Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowTranslucentStatus">true</item>
    </style>
</resources>

values-v21 / styles.xml :

<?xml version="1.0" encoding="UTF-8" ?>
<resources>
    <style name="MyStyle" parent="@style/Theme.AppCompat.Light.NoActionBar">
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
</resources>

AndroidManifest는 “MyStyle”을 대상으로합니다.

AndroidManifest.xml :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.agn.test.test">
    <uses-sdk android:minSdkVersion="10" />
    <application android:allowBackup="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:theme="@style/MyStyle">
    </application>
</manifest>

그리고 마지막으로 주요 활동의 코드 :

[Activity (Label = "Test", MainLauncher = true, Icon = "@mipmap/icon")]
public class MainActivity : Activity
{
    protected override void OnCreate (Bundle savedInstanceState)
    {
        base.OnCreate (savedInstanceState);

        SetContentView (Resource.Layout.Main);
        //Resource.Layout.Main is just a regular layout, no additional flags. Make sure there is something in there like an imageView, so that you can see the overlay.

        var uiOptions = (int)Window.DecorView.SystemUiVisibility;
        uiOptions ^= (int)SystemUiFlags.LayoutStable;
        uiOptions ^= (int)SystemUiFlags.LayoutFullscreen;
        Window.DecorView.SystemUiVisibility = (StatusBarVisibility)uiOptions;

        Window.AddFlags (WindowManagerFlags.DrawsSystemBarBackgrounds);
    }
}

DrawsSystemBarBackgrounds 플래그를 설정하면 모든 차이가 발생합니다.

Window.AddFlags (WindowManagerFlags.DrawsSystemBarBackgrounds); 

사실 너무 많은 시간을 제대로 보냈습니다. 이 답변이 같은 일을 달성하려는 사람에게 도움이 되길 바랍니다.


답변

@Cody Toombs의 답변으로 인해 탐색 모음 뒤에 레이아웃이 나타나는 문제가 발생합니다. 그래서 내가 찾은 것은 @Kriti가 제공 한이 솔루션을 사용 하는 것입니다.

Kotlin 코드 스 니펫은 다음과 같습니다.

if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) {
    setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, true)
}

if (Build.VERSION.SDK_INT >= 19) {
    window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
}

if (Build.VERSION.SDK_INT >= 21) {
    setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false)
    getWindow().setStatusBarColor(Color.TRANSPARENT)
}

private fun setWindowFlag(activity: Activity, bits: Int, on: Boolean) {

    val win: Window = activity.getWindow()

    val winParams: WindowManager.LayoutParams = win.getAttributes()
    if (on) {
        winParams.flags = winParams.flags or bits
    } else {
        winParams.flags = winParams.flags and bits.inv()
    }
    win.setAttributes(winParams)
}

또한 추가해야합니다

android:fitsSystemWindows="false"

레이아웃의 루트보기.


답변

나는 같은 문제가있어서 상태 표시 줄 API 19 이상을 그리는 ImageView를 만듭니다.

상태 표시 줄 뒤에 사용자 정의 이미지 설정 gist.github.com

public static void setTransparent(Activity activity, int imageRes) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
        return;
    }
    // set flags
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
    } else {
        activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    }

    // get root content of system window
    //ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
    // rootView.setFitsSystemWindows(true);
    // rootView.setClipToPadding(true);

    ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
    if (contentView.getChildCount() > 1) {
        contentView.removeViewAt(1);
    }

    // get status bar height
    int res = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
    int height = 0;
    if (res != 0)
        height = activity.getResources().getDimensionPixelSize(res);

    // create new imageview and set resource id
    ImageView image = new ImageView(activity);
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height);
    image.setLayoutParams(params);
    image.setImageResource(imageRes);
    image.setScaleType(ScaleType.MATRIX);

    // add image view to content view
    contentView.addView(image);
    // rootView.setFitsSystemWindows(true);

}