Леденец: нарисуйте позади строки состояния с его цветом, установленным на прозрачный
Я установил свой цвет строки состояния прозрачным для Lollipop только со следующей строкой в моей теме:
<item name="android:statusBarColor">@android:color/transparent</item>
теперь мне нужно рисовать за ним, но я не могу получить никакого вида рисовать за ним. Я знаю, как это сделать с windowTranslucentStatus свойство, но не хотите использовать это свойство, так как оно будет игнорировать цвет строки состояния, установленной в transparent.
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 связано или нет, но теперь у меня есть приемлемое решение:
Это моя установка:
у меня есть проект 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
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