Nano Hash - криптовалюты, майнинг, программирование

Appcompat v21 Toolbar повышение уровня леденца на палочке

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

В своем приложении я использую панель инструментов из 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" />

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

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

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


Ответы:


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>
11.03.2015
  • Браво :) +1 за взлом :) У меня сработало. 28.03.2015
  • У меня это работает с API 22, но не с API 21 (мой minSdk равен 19). Я использую тот же код, что и вы. В любом случае, основная тема моего приложения наследуется от Theme.AppCompat.Light.NoActionBar. Я не знаю, может ли это быть причиной ошибки. Есть идеи? (Я только начал разработку Android). 23.04.2015
  • Я тоже наследую от Theme.AppCompat.Light.NoActionBar. У меня это работает на уровнях API 10, 19 и 21. Как именно это не работает у вас? что вы получаете? 23.04.2015
  • Хорошо поработал, спасибо чувак. Но теперь мой вид карты не будет соответствовать ширине родителя, он оставляет немного места слева и справа. Как сделать так, чтобы этот вид карты заполнил всю ширину экрана? Заранее спасибо :) 26.05.2015
  • Я не думаю, что вы можете сделать это, пока вы используете возвышение. Когда я хочу это сделать, я вообще не использую возвышение. Я добавляю представление с градиентом для фона под панелью инструментов, чтобы оно действовало как тень. 27.05.2015
  • Я выбрал это решение. Но оказалось, что некоторые устройства (до леденца на палочке) показывают небольшое поле вокруг панели инструментов. Кто-нибудь знает, что это может быть? 08.08.2015
  • Попробуйте добавить card_view:cardUseCompatPadding="true" в карточку. Скажите, сработало ли это, чтобы я добавил это к ответу. 09.08.2015
  • У меня та же проблема с Тристаном. Использование cardUseCompatPadding не помогает. В моем случае это происходит на Android 4.1. 13.08.2015
  • Починил это. Для тех, у кого есть проблемы с полями панели инструментов в предварительных выпусках леденцов, обратитесь к этому принятому ответу: stackoverflow.com/questions/27477371/ 13.08.2015
  • @ Linox83 Linox83 ответ ничего не говорит о проблеме поля cardView compatPadding. Как вам удалось это исправить? 08.01.2016
  • Решение не работает. См. imgur.com/dQa6NJj. Я думаю, что мы должны переопределить AppBarLayout, чтобы добавить к нему тень. 11.02.2017

  • 2

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

    CardView тяжеловат, особенно для недорогих устройств.

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

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

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

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

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

    Сделанный.

    02.06.2016
  • Я попробовал ваше решение, и похоже, что тень панели инструментов не будет скрываться при прокрутке на устройствах до лолипопа. Как вы думаете, возможно ли скрыть это с помощью некоторых атрибутов xml? 04.12.2017
  • Содержимое должно прокручиваться под тенью панели инструментов. Если вам нужна эта теневая прокрутка под панелью инструментов (что очевидно), добавьте теневой вид под прокруткой. 05.12.2017
  • Вы можете отключить повышение в макете панели приложений в xml, чтобы использовать градиент во всей версии. android:stateListAnimator="@null" 28.05.2018

  • 3

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

    07.03.2015
  • Я, наконец, пошел по этому пути после тестирования некоторых других ответов здесь. Это работает только с frameLayout, но есть несколько способов расширить Relativelayout и использовать передний план: суть. github.com/shakalaca/6199283 10.03.2015
  • если у вас есть случай, когда вы не используете фрагменты и FrameLayout, тогда вы должны сделать ImageView прямо под (ниже) вашей панелью инструментов и дать ему тень, которую можно рисовать, как атрибут фона. Например, используйте ответ @Alessandro Roaro и создайте тень, которую можно нарисовать из этого ссылка 10.03.2015
  • Однако использование ?android:windowContentOverlay везде казалось более последовательным. Я не люблю смешивать два подхода. У меня есть фрагменты почти везде в моих макетах, так что это не проблема. 10.03.2015
  • Работает, до сих пор не могу понять, почему это работает на Lolipop с набором высоты, и тень в самый раз, а не двойная темная. 04.07.2015
  • Это похоже на решение этой проблемы. Но тень выглядит не очень хорошо и реалистично. Смотрите картинку с Pre-Lollipop и Marshmallow: imgur.com/tyIWMUJ 11.02.2017

  • 4

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

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

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

    И не забудьте закрыть с помощью:

    </FrameLayout>
    
    24.04.2015

    5

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

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

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

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

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

    Видеть:

    07.01.2015

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

    7

    Вы не можете использовать атрибут высоты до 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"/>
    

    Где тень рисуется с черным градиентом.

    04.11.2014
  • Кажется, это единственный способ добавить тень под панелью инструментов. Но я втайне надеялся, что будет другое решение :p 05.11.2014
  • Также реализация CardView в API поддержки использует тень, созданную программно для воспроизведения тени. 05.11.2014
  • Да, в самом деле. Так что, может быть, appcompat реализует что-то подобное в будущем? 05.11.2014
  • Надеюсь, они будут :) Я не знаю, почему он еще не включен, я столкнулся с той же проблемой несколько дней назад. 05.11.2014

  • 8

    Чтобы отобразить тень под панелью инструментов, используйте 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, введите в файл build.gradle следующее:

     compile 'com.android.support:design:22.2.0'
    
    28.09.2015
  • Как за этот ответ проголосовали? OP запросил повышение уровня до леденцов, и этот ответ не повышает уровень AppBarLayout на устройствах до леденцов. Это добавляет эффект повышения только на устройствах v5.0+. 02.06.2016

  • 9

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

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

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

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

    11.06.2015

    10

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

    19.04.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..