Высота не работает для нижнего листа внутри макета координатора

Я пытаюсь использовать BottomSheet в своем макете. Корневой вид — это CoordinatorLayout, и я хочу установить Elevation сверху для нижнего листа, поэтому я устанавливаю для него высокое значение (50dp), однако оно не отображается, когда приложение запускается, но появляется в инструменте дизайна студии Android.

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

вот мой XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.atefhares.StartActivity"
    android:clipToPadding="false">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <LinearLayout
            android:id="@+id/DetailsView"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:orientation="vertical">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Details Should be shown here"
                android:id="@+id/textView"
                android:textSize="25sp"
                android:padding="20dp" />
        </LinearLayout>

        <fragment xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:id="@+id/map"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context="com.atefhares.Start_Activity" />


    </LinearLayout>
    <android.support.v4.widget.SlidingPaneLayout
        android:id="@+id/bottom_sheet"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:behavior_peekHeight="70dp"
        app:layout_behavior="android.support.design.widget.BottomSheetBehavior"
        android:background="@drawable/gradiant"
        android:fillViewport="true"
        android:elevation="50dp">


        <include layout="@layout/bottom_sheet_layout"/>

    </android.support.v4.widget.SlidingPaneLayout>

</android.support.design.widget.CoordinatorLayout>

Изменить: bottom_sheet_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    android:orientation="vertical">


    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:background="@color/colorPrimary"
        android:padding="10dp"
        android:id="@+id/inviteLL">

        <ImageView
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:id="@+id/imageView"
            android:background="@drawable/invite_icon"
            android:layout_margin="5dp"
            android:layout_gravity="center_vertical" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Invite Friends"
            android:textSize="22sp"
            android:textColor="#ffffff"
            android:padding="10dp"
            android:fontFamily="sans-serif-condensed"
            android:gravity="center_vertical"
            android:id="@+id/inviteTV"

            android:layout_gravity="center_vertical"
            android:layout_weight="1" />

        <ImageView
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:id="@+id/arrowIV"
            android:layout_gravity="center_vertical"
            android:background="@drawable/arrow_up" />
    </LinearLayout>


    <ListView
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:id="@+id/usersLV"
        android:dividerHeight="1dp"
        android:divider="#ffffff"
        android:background="#ffffff" />

</LinearLayout>

Итак, как я могу сделать так, чтобы высота показывалась поверх Bottom Sheet

Кто-нибудь может помочь, пожалуйста?


person ATEF    schedule 30.07.2016    source источник
comment
Та же проблема здесь :) проголосовал за ваш вопрос. Могу ли я предложить вам добавить скриншот? Также добавлена ​​награда   -  person Daniele Segato    schedule 01.09.2016
comment
какой телефон с версией Android вы использовали для тестирования?   -  person piotrek1543    schedule 01.09.2016
comment
Опубликуйте код макета нижнего листа   -  person Burhanuddin Rashid    schedule 06.09.2016
comment
@piotrek1543 версии M, K, L   -  person ATEF    schedule 06.09.2016
comment
@BurhanuddinRashid, проверьте   -  person ATEF    schedule 06.09.2016
comment
измените родительский макет с LinearLayout на FrameLayout или аналогичный, поддерживающий высоту   -  person piotrek1543    schedule 06.09.2016
comment
@DanieleSegato, да, конечно, добавьте свое предложение, и я одобрю его, если оно будет таким же   -  person ATEF    schedule 06.09.2016
comment
@piotrek1543 не сработало, и я не ожидал, что это сработает!   -  person ATEF    schedule 06.09.2016
comment
@piotrek1543 piotrek1543 даже CardView не показывает высоту на этом. Атеф, я предлагал вам добавить свой скриншот :)   -  person Daniele Segato    schedule 07.09.2016
comment
@DanieleSegato Я добавил свой ответ, надеюсь, он поможет вам и Атефу.   -  person JJ86    schedule 07.09.2016
comment
Я решил проблему в своем собственном макете. У меня только что был clipToPadding="true", который был там бессмысленным. Видать не успел видимо. Вы пытались обернуть SlidePaneLayout в другое представление и дать ЭТОМУ представлению BottomSheetBehavior? И случайно ли ваш взгляд не прозрачен? По умолчанию представления используют фон для определения контура: нет фона = нет контура = нет тени. Проверьте это: developer.android.com/reference/android/view/   -  person Daniele Segato    schedule 07.09.2016
comment
@DanieleSegato, да, я пытался использовать Linear layout вместо SlidingPaneLayout => без разницы, и я изменил фон на сплошной цвет => без разницы   -  person ATEF    schedule 07.09.2016
comment
лучше попробуй убрать фон   -  person Daniele Segato    schedule 07.09.2016
comment
@AtefHares Я обнаружил, что у других ребят такая же проблема: stackoverflow.com/q/32395983/2013835 и stackoverflow.com/q/27741567/2013835   -  person JJ86    schedule 08.09.2016
comment
@ JJ86 Да, я видел эти вопросы, но все ответы касаются использования обходных путей :(   -  person ATEF    schedule 08.09.2016
comment
@AtefHares Я никогда не видел высоты над видом в приложении (приложения Google и другие). Как я уже говорил в своем ответе, возможно, это невозможно. Конечно, если он существует, я буду первым, кто его реализует ;-).   -  person JJ86    schedule 09.09.2016


Ответы (4)


В соответствии с рекомендациями Google для android:высота невозможно (Также вы можете прочитать больше о keyligth).

В любом случае, в наиболее распространенных случаях, когда вы прокручиваете «BottomSheet» вверх, за «BottomSheet» появляется полупрозрачный слой, это помогает пользователю сосредоточиться на действиях «BottomSheet», например эти примеры.

Если в любом случае вам нужна верхняя тень, вы можете установить рисуемый фон с таким градиентом (shadow_top.xml):

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
    android:angle="90"
    android:centerColor="#000000"
    android:endColor="@android:color/transparent"
    android:startColor="#000000"
    android:type="linear" />

And your SlidingPanelLayout will be:

<android.support.v4.widget.SlidingPaneLayout
    android:id="@+id/bottom_sheet"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:behavior_peekHeight="95dp"
    android:paddingTop="25dp"
    app:layout_behavior="android.support.design.widget.BottomSheetBehavior"
    android:background="@drawable/shadow_top"
    android:fillViewport="true"
    >

С наилучшими пожеланиями.

person Vinicius DSL    schedule 07.09.2016
comment
нигде в правилах гугла не сказано, что это невозможно - person Daniele Segato; 08.09.2016
comment
В рекомендациях написано «Комбинированная тень от основного и окружающего света», и вы можете видеть, как свет направлен. - person Vinicius DSL; 08.09.2016
comment
Ага. Там не сказано, что внизу нет тени. Это комбинировано. И окружающий свет не имеет направления. - person Daniele Segato; 08.09.2016
comment
да, но посмотрите на Тень, отбрасываемую ключевым источником света, сверху нет тени, вы можете предположить направление ключевого света (я не видел возможности изменить ключевой источник света на Android) en.wikipedia.org/wiki/Key_light - person Vinicius DSL; 08.09.2016
comment
у меня есть нижний лист в моем приложении, у него есть высота, и я вижу высоту сверху. Он НАМНОГО менее заметен, чем если бы он был снизу (16dp), но он виден. Так что ваш аргумент несостоятелен. Окружающая тень видна сверху. - person Daniele Segato; 08.09.2016
comment
Опять же.. Я сказал, посмотрите на SHADOW CAST BY KEY LIGHT, наверху нет тени. Я знаю, что тень наверху это результат окружающего света, большая часть конечной тени вызвана тенью, отбрасываемой ключевым светом и пока я не знаю, на Android вы не можете изменить/обратить этот свет. - person Vinicius DSL; 08.09.2016

Не забывайте, что для рисования тени необходимо использовать аппаратное ускорение рисования.

hardwareAccelerated = true введите здесь описание изображения

hardwareAccelerated = false введите здесь описание изображения

См. аппаратное ускорение Android.

person Danil Onyanov    schedule 06.09.2016
comment
он включен по умолчанию - person Daniele Segato; 06.09.2016

Попробуй это,

<android.support.v4.widget.SlidingPaneLayout
        android:id="@+id/bottom_sheet"
xmlns:slide_panel="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:behavior_peekHeight="70dp"
      app:layout_behavior="android.support.design.widget.BottomSheetBehavior"
        android:background="@drawable/gradiant"
        android:fillViewport="true"
        slide_panel:elevation="50dp">
person Karthik Sridharan    schedule 07.09.2016
comment
высота работает только для устройств более 5.0 - person Karthik Sridharan; 07.09.2016
comment
Повышение работает везде на 5+ устройствах. Это атрибут представления. Но здесь это не работает из-за того, что BottomSheetBehavior делает модификацию, которую вы предлагаете: использование slide_panel:elevation вместо android:elevation бессмысленно. - person Daniele Segato; 07.09.2016

Ответ: нет, это невозможно (если только вы не создадите свой собственный вид с функцией повышения высоты).

Подъем должен быть виден не вверху изображения, а внизу, справа и слева.

Если вы внимательно изучите официальные рекомендации по дизайну материалов, вы увидите, что на нижнем баре его просто нет (не путать с серым пространством между картой и нижним баром).

введите здесь описание изображения

Например: импортируйте образец Card View из Android Studio и поиграйте с ним в эмуляторе или на своем устройстве. Вы увидите, что если вы увеличите значение высоты, его тень появится везде, кроме верхней части (см. второе изображение ниже).

введите здесь описание изображения

Другой пример — импорт Elevation Basic.

ИЗМЕНИТЬ

Следующий код взят из примера Card View. Существует макет, содержащий CardView с высотой. Всякий раз, когда вы меняете высоту, вы всегда будете видеть тень везде, но не сверху (код был протестирован с Lollipop и Marshmallow).

<LinearLayout android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="vertical"
              android:paddingBottom="@dimen/activity_vertical_margin"
              android:paddingTop="@dimen/activity_vertical_margin"
              android:paddingLeft="@dimen/activity_horizontal_margin"
              android:paddingRight="@dimen/activity_horizontal_margin"
    >
    <android.support.v7.widget.CardView
        android:id="@+id/cardview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:elevation="100dp"
        card_view:cardBackgroundColor="@color/cardview_initial_background"
        card_view:cardCornerRadius="8dp"
        android:layout_marginLeft="@dimen/margin_large"
        android:layout_marginRight="@dimen/margin_large"
        >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/margin_medium"
            android:text="@string/cardview_contents"
            />
    </android.support.v7.widget.CardView>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/margin_large"
        android:orientation="horizontal"
        >
        <TextView
            android:layout_width="@dimen/seekbar_label_length"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="@string/cardview_radius_seekbar_text"
            />
        <SeekBar
            android:id="@+id/cardview_radius_seekbar"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/margin_medium"
            />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >
        <TextView
            android:layout_width="@dimen/seekbar_label_length"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="@string/cardview_elevation_seekbar_text"
            />
        <SeekBar
            android:id="@+id/cardview_elevation_seekbar"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/margin_medium"
            />
    </LinearLayout>
</LinearLayout>

person JJ86    schedule 07.09.2016
comment
Я ценю подробный ответ, но это просто неправда. Как видно из изображения здесь: developer.android.com/training/material /shadows-clipping.html тень четко видна поверх изображения. Причина, по которой ваше изображение не показывает тени сверху, наверняка заключается в чем-то другом (например, в вашем макете). - person Daniele Segato; 07.09.2016
comment
@DanieleSegato спасибо, но я ясно вижу мазок слева, справа и внизу первого прямоугольника. Пример взят из кода Google, я обновил свой ответ. - person JJ86; 08.09.2016
comment
@DanieleSegato этот чувак добавил больше деталей, включая ссылку на другие рекомендации: stackoverflow.com/a/39380091/2013835 . - person JJ86; 08.09.2016
comment
У меня есть код прямо здесь с тенью сверху с использованием высоты. Работающий. Для меня. Вопрос был очень глупым. Для первоначального вопроса это что-то другое. Но ответ НЕ: невозможно иметь тень сверху. - person Daniele Segato; 08.09.2016
comment
@DanieleSegato хорошо, вы можете поделиться кодом в другом ответе или, может быть, отредактировать мой? - person JJ86; 08.09.2016
comment
мой код сильно отличается от кода вопроса. И проблема заключалась в атрибуте clipToPadding, который я совершенно не заметил, когда добавлял награду к этому вопросу. У меня нет времени исследовать его код, но я предполагаю, что это связано с фоном представления. - person Daniele Segato; 08.09.2016
comment
Этот ответ вводит в абсолютное заблуждение. В верхней части вида с возвышением ЕСТЬ тень. Вы можете видеть разрезы в вашем примере на каждой стороне карты, а не только сверху, так что это проблема с вашим макетом, а не с тенью сверху. В качестве ключа к пониманию попробуйте поиграть с атрибутом clipToPadding. - person the korovay; 11.06.2021