development

롤리팝 : 색상을 투명하게 설정하여 statusBar 뒤에 그리기

big-blog 2020. 7. 2. 07:14
반응형

롤리팝 : 색상을 투명하게 설정하여 statusBar 뒤에 그리기


테마에 다음 줄만 있으면 Lollipop에 대해 statusBar 색상을 투명으로 설정했습니다.

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

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


방법 # 1 :

완전히 투명한 상태 표시 줄을 얻으려면 statusBarColorAPI 21 이상에서만 사용할 수 있는을 사용해야 합니다. windowTranslucentStatusAPI 19 이상에서 사용할 수 있지만 상태 표시 줄에 색조 배경을 추가합니다. 그러나 설정 windowTranslucentStatusstatusBarColor투명으로 변경 하지 않고 한 가지를 달성 합니다. SYSTEM_UI_FLAG_LAYOUT_STABLESYSTEM_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);

}

ScrimInsetFrameLayout을 사용할 수 있습니다

https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget/ScrimInsetsFrameLayout.java

android : fitsSystemWindows = "true"가 스크림 레이아웃에서 설정되어야합니다!


게시 된 일부 솔루션과 유사하지만 제 경우에는 상태 표시 줄을 투명하게하고 작업 표시 줄의 위치를 ​​약간의 마진으로 고정하십시오

if (Build.VERSION.SDK_INT >= 21) {
    getWindow().setStatusBarColor(Color.TRANSPARENT);
    FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) toolbar.getLayoutParams();
    lp.setMargins(0, -getStatusBarHeight(), 0, 0);
}

툴바와 루트 뷰에서 사용했습니다.

android:fitsSystemWindows="true"

There is good library StatusBarUtil from @laobie that help to easily draw image in the StatusBar.

Just add in your build.gradle:

compile 'com.jaeger.statusbarutil:library:1.4.0'

Then in the Activity set

StatusBarUtil.setTranslucentForImageView(Activity activity, int statusBarAlpha, View viewNeedOffset)

In the layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:orientation="vertical">

    <ImageView
        android:layout_alignParentTop="true"
        android:layout_width="match_parent"
        android:adjustViewBounds="true"
        android:layout_height="wrap_content"
        android:src="@drawable/toolbar_bg"/>

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/view_need_offset"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@android:color/transparent"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

        <!-- Your layout code -->
    </android.support.design.widget.CoordinatorLayout>
</RelativeLayout>

For more info download demo or clone from github page and play with all feature.

Note: Support KitKat and above.

Hope that helps somebody else!


With Android Studio 1.4, the template project with boiler plate code sets Overlay theme on your AppbarLayout and/or Toolbar. They are also set to be rendered behind the status bar by fitSystemWindow attribute = true. This will cause only toolbar to be rendered directly below the status bar and everything else will rendered beneath the toolbar. So the solutions provided above won't work on their own. You will have to make the following changes.

  • Remove the Overlay theme or change it to non overlay theme for the toolbar.
  • Put the following code in your styles-21.xml file.

    @android:color/transparent

  • Assign this theme to the activity containing the navigation drawer in the AndroidManifest.xml file.

This will make the Navigation drawer to render behind the transparent status bar.


All you need to do is set these properties in your theme

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

The accepted answer worked for me using a CollapsingToolbarLayout. It's important to note though, that setSytstemUiVisibility() overrides any previous calls to that function. So if you're using that function somewhere else for the same view, you need to include the View.SYSTEM_UI_FLAG_LAYOUT_STABLE and View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN flags, or they will be overridden with the new call.

This was the case for me, and once I added the two flags to the other place I was making a call to setSystemUiVisibility(), the accepted answer worked perfectly.


Here is the theme I use to accomplish this:

<style name="AppTheme" parent="@android:style/Theme.NoTitleBar">

    <!-- Default Background Screen -->
    <item name="android:background">@color/default_blue</item>
    <item name="android:windowTranslucentStatus">true</item>

</style>

The Right solution is to Change a property in XML under your Activity tag to below style. It just works

  android:theme="@style/Theme.AppCompat.Light.NoActionBar"

참고 URL : https://stackoverflow.com/questions/27856603/lollipop-draw-behind-statusbar-with-its-color-set-to-transparent

반응형