Подтвердить что ты не робот

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 на устройствах с предварительным леллипом?

4b9b3361

Ответ 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, чтобы заставить его работать.