Леденец: нарисуйте позади строки состояния с его цветом, установленным на прозрачный



Я установил свой цвет строки состояния прозрачным для Lollipop только со следующей строкой в моей теме:



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


теперь мне нужно рисовать за ним, но я не могу получить никакого вида рисовать за ним. Я знаю, как это сделать с windowTranslucentStatus свойство, но не хотите использовать это свойство, так как оно будет игнорировать цвет строки состояния, установленной в transparent.

446   13  

13 ответов:

Способ #1:

для достижения полностью прозрачной строки состояния, вы должны использовать statusBarColor, который доступен только на API 21 и выше. windowTranslucentStatus доступен на API 19 и выше, но он добавляет тонированный фон для строки состояния. Однако, установка windowTranslucentStatus достигает одной вещи, которая меняется statusBarColor к прозрачному не делает: оно устанавливает 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 статья полиции несколько месяцев назад.

Способ #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;
}

для получения дополнительной информации о работе с панелями состояния: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 связано или нет, но теперь у меня есть приемлемое решение:

Example

Это моя установка:

у меня есть проект Android, где я ссылался на Android.Поддержка пакетов v4 и v7. У меня есть два стиля определено:

ценностей/стили.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>

значения-v21 / стили.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); 

Я потратил много времени, чтобы получить это право, тоже много времени на самом деле. Надеюсь, этот ответ поможет кто пытается достичь того же.

вы можете использовать ScrimInsetFrameLayout

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

android: fitsSystemWindows= "true" должно быть установлено на макете scrim!

похоже на некоторые из опубликованных решений, но в моем случае я сделал строку состояния прозрачной и зафиксировал положение панели действий с некоторым отрицательным запасом

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"

У меня была та же проблема, поэтому я создаю ImageView, которые рисуют за API строки состояния 19+

установите пользовательское изображение за строку состояния 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);

}

ответ@Cody Toombs приводит к проблеме, которая приводит макет за панель навигации. Так что я нашел с помощью этой решение, данное @Kriti

вот фрагмент кода Котлина для того же:

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"

корневой вид вашего макета.

С Android Studio 1.4, шаблонный проект с кодовыми наборами котельной плиты Overlay тема на вашем AppbarLayout и / или панели инструментов. Они также настроены для отображения за строкой состояния с помощью fitSystemWindow атрибут = true. Это приведет к тому, что только панель инструментов будет отображаться непосредственно под строкой состояния, а все остальное будет отображаться под панелью инструментов. Таким образом, решения, представленные выше, не будут работать сами по себе. Вам придется внести следующие изменения.

  • удалить оверлея тема или измените ее на тему без наложения для панели инструментов.
  • ставим следующий код стили-21.xml.

    @андроид:цвет/прозрачный

  • назначьте эту тему деятельности, содержащей навигационный ящик в элемент AndroidManifest.xml.

это сделает навигационный ящик для отображения за прозрачной строкой состояния.

есть хорошая библиотека StatusBarUtil С @laobie это поможет легко нарисовать изображение в строке состояния.

просто добавьте в свой build.gradle:

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

затем в наборе действий

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

в макете

<?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>

для получения дополнительной информации скачать демо или Клон от страница github и играть со всеми функция.

Примечание: поддержка KitKat и выше.

надеюсь, что помогает кому-то еще!

вот тема, которую я использую для достижения этой цели:

<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>

правильное решение-изменить свойство в XML под тегом Activity на стиль ниже. Это просто работает

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

Comments

    Ничего не найдено.