Appcompat v21 Предварительная леопапка панели инструментов

Во-первых, я знаю, что этот вопрос задавали раньше, но на него еще не ответили. Надеюсь, кто-то может дать мне ответ.

В моем приложении я использую панель инструментов из Appcompat_v7 (API 21). Это мой код:

<android.support.v7.widget.Toolbar style="@style/DarkActionbarStyle" android:id="@+id/toolBar" android:layout_width="match_parent" android:layout_height="@dimen/actionbar_height" /> 

И это стиль ToolBar, который я использую:

 <style name="DarkActionbarStyle" parent="@style/Widget.AppCompat.Toolbar"> <item name="android:background">?attr/colorPrimary</item> <item name="titleTextAppearance">@style/ActionBarTitle</item> <item name="android:elevation">2dp</item> <item name="popupTheme">@style/ThemeOverlay.AppCompat.Light</item> <item name="theme">@style/ThemeActionBarDark</item> </style> <style name="ThemeActionBarDark" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <item name="actionBarItemBackground">@drawable/btn_dark_orange</item> <item name="selectableItemBackground">@drawable/btn_dark_orange</item> </style> 

Проблема в том, что возвышение не работает перед леоптипом. Поэтому мой вопрос: возможно ли иметь тень под ToolBar на устройствах с предварительным леллипопом?

Это сработало для меня очень хорошо:

 <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/primary" card_view:cardElevation="4dp" card_view:cardCornerRadius="0dp"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/primary" android:minHeight="?attr/actionBarSize" /> </android.support.v7.widget.CardView> 

Вы можете добавить тень (возвышение) назад, используя FrameLayout с foreground="?android:windowContentOverlay" . Атрибут Elevation не поддерживается pre-Lollipop. Поэтому, если вы используете FrameLayout как контейнер фрагмента, просто добавьте к нему атрибут переднего плана.

Использование контейнера CardView для панели инструментов – плохая идея.

CardView тяжелый, особенно для устройств с низким уровнем мощности.

Лучше всего поместить градиентный вид тени под панелью инструментов. Теневой вид должен быть прямым ребенком в макете координатора. то есть. Панель приложений, содержащая панель инструментов и теневой вид, должна быть братьями и сестрами.

Добавьте этот компонент вида в свой макет.

  <View android:id="@+id/gradientShadow" android:layout_width="match_parent" android:layout_height="5dp" android:background="@drawable/toolbar_shadow" app:layout_behavior="@string/appbar_scrolling_view_behavior" app:layout_collapseMode="pin"/> 

Выделяемый toolbar_shadow.xml

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:angle="90" android:endColor="#33333333" android:startColor="@android:color/transparent"/> </shape> 

Это решит проблемы в устройствах с предварительным леллипопом. Но мы не хотим, чтобы эта тень находилась на леденцах и выше, поэтому вы можете видеть видимость на устройствах с леденцом и выше.

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { findViewById(R.id.gradientShadow).setVisibility(View.GONE); } 

Готово.

Поскольку у меня были проблемы с виджетами CardView, я использовал метод FrameLayout, как упоминалось в @Sniper; Он работает отлично!

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

 <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:foreground="?android:windowContentOverlay"> 

И не забудьте закрыть:

 </FrameLayout> 

Возможно иметь реальные тени – анимированные и сгенерированные. Метод, используемый Lollipop, доступен со времен Froyo. Аппаратное ускорение, используемое для теневого генерации, доступно, поскольку я думаю, что Honeycomb. Вот как это работает:

  • Нарисуйте ваше представление на нестандартном растровом изображении с помощью LightingColorFilter, установленного на 0,0
  • Размытие черной формы (растровое изображение вне экрана) с использованием класса ScriptIntrinsicBlur и значения высоты в радиусе
  • Нарисуйте растровое изображение под видом

Он требует добавления пользовательских атрибутов возвышения, пользовательских представлений, способных визуализировать тени, а также использования сценария рендеринга и библиотеки совместимости (для более старых устройств). Я не собираюсь погружаться в детали, потому что их много, включая проблемы с компиляцией и небольшие оптимизации производительности. Но это возможно.

Почему в официальной библиотеке поддержки нет теней?

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

Видеть:

Я использую этот ответ :

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/orange" android:titleTextAppearance="@color/White" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" /> <View android:layout_width="match_parent" android:layout_height="5dp" android:background="@drawable/toolbar_shadow" /> </LinearLayout> 

Toolbar_shadow.xml :

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <gradient android:startColor="#3f3f3f" android:endColor="@android:color/transparent" android:angle="270" /> </shape> 

Чтобы показать тень под панелью инструментов, используйте AppBarLayout, доступную в Google Support Design Library. Вот пример того, как он должен использоваться.

 <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.Toolbar android:layout_height="?attr/actionBarSize" android:layout_width="match_parent"/> </android.support.design.widget.AppBarLayout> 

Чтобы использовать библиотеку поддержки Google Android Design, введите следующую команду в файл build.gradle:

  compile 'com.android.support:design:22.2.0' 

Вы не можете использовать атрибут высоты перед API 21 (Android Lollipop). Тем не менее вы можете добавить тень программно, например, используя пользовательский вид, расположенный под Toolbar .

Например:

 <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/toolbar" android:background="@drawable/shadow"/> 

Там, где тень доступна для рисования с черным градиентом.

Решение с целью добавления тени вручную будет работать до тех пор, пока нет меню панели действий. Если это так, теневое представление остановится перед значками панели действий.

Я думаю, что проще иметь вертикальную линейную компоновку с верхней панелью приложения и вид тени ниже ее как следующий элемент линейного макета или в моем случае, это

 <LinearLayout Vertical> <v7 toolbar/> <RelativeLayout> <View for shadow with alignParent_top= true/> .... </RelativeLayout> </LinearLayout> 

Я очень надеюсь, что ближайшее приложение appCompat исправит это.

Другим вариантом является следующая библиотека, которая обеспечивает 9patch тени, как iosched приложение, android-materialshadowninepatch

Я думаю, что вы можете, у меня была проблема с повышением CardView с помощью библиотеки поддержки. Чтобы это сработало, мне нужно было настроить свое мнение следующим образом.

 <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android.support.v7.cardview="http://schemas.android.com/apk/res-auto" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="125dp" android:orientation="horizontal" android:layout_margin="5dp" card_view:cardCornerRadius="5dp" android.support.v7.cardview:cardElevation="10dp"> </android.support.v7.widget.CardView> 

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

 android.support.v7.toolbar:elevation="10dp" 

Опять же, я не проверял это. Но обратите внимание, что я должен был использовать android.support.v7 чтобы заставить его работать.