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 на устройствах с предварительным леллипом?
Ответы
Ответ 1
Это сработало для меня очень хорошо:
<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>
Ответ 2
Использование контейнера 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);
}
Готово.
Ответ 3
Вы можете добавить тень (возвышение) назад, используя FrameLayout
с foreground="?android:windowContentOverlay"
. Атрибут Elevation не поддерживается pre-Lollipop. Поэтому, если вы используете FrameLayout
как контейнер фрагмента, просто добавьте к нему атрибут переднего плана.
Ответ 4
Поскольку у меня возникли проблемы с виджетами CardView, я использовал метод FrameLayout, как указано @Sniper; он отлично работает!
Я просто хотел поделиться фрагментом кода, который вам нужно будет использовать.
Просто поставьте это прямо под панелью инструментов, где начинается основное содержание:
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:foreground="?android:windowContentOverlay">
И не забудьте закрыть:
</FrameLayout>
Ответ 5
Возможно иметь реальные тени - анимированные и сгенерированные. Метод, используемый Lollipop, доступен со времен Froyo. Аппаратное ускорение, используемое для теневого генерации, доступно, поскольку я думаю, что Honeycomb. Вот как это работает:
- нарисуйте ваше представление на внеэкранном растровом изображении с помощью LightingColorFilter, установленного на 0,0
- размыть черную фигуру (растровое изображение вне экрана), используя класс ScriptIntrinsicBlur и значение высоты как радиус
- нарисуйте растровое изображение под представлением
Он требует добавления пользовательских атрибутов возвышения, пользовательских представлений, способных отображать тени, и использования render script и библиотеки совместимости (для более старых устройств). Я не буду погружаться в детали, потому что их много, включая проблемы с компиляцией и незначительные оптимизации производительности. Но это возможно.
Почему в официальной библиотеке поддержки нет теней?
- это потребует изменений в интерфейсе пользовательского интерфейса, поскольку невозможно свободно рисовать границы внешнего вида.
- Для гладкой анимации требуется неплохой графический процессор
См:
Ответ 6
Я использую этот ответ:
<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>
Ответ 7
Чтобы показать тень под панелью инструментов, используйте AppBarLayout, доступную в Библиотеке поддержки дизайна Google Android. Вот пример того, как его следует использовать.
<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'
Ответ 8
Вы не можете использовать атрибут высоты перед 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"/>
Там, где тень доступна для рисования с черным градиентом.
Ответ 9
Решение с целью добавления тени вручную будет работать до тех пор, пока нет меню панели действий. Если это так, теневое представление остановится перед значками панели действий.
Я думаю, что проще иметь вертикальную линейную компоновку с верхней панелью приложения и вид тени ниже ее как следующий элемент линейного макета, или в моем случае это
<LinearLayout Vertical>
<v7 toolbar/>
<RelativeLayout>
<View for shadow with alignParent_top= true/>
....
</RelativeLayout>
</LinearLayout>
Я очень надеюсь, что ближайшее приложение appCompat исправит это.
Ответ 10
Другим вариантом является следующая библиотека, которая обеспечивает 9patch тени, такие как iosched app, android-materialshadowninepatch
Ответ 11
Я думаю, что вы можете, у меня была проблема с высотой 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
, чтобы заставить его работать.