Возвышение на Android Lollipop не работает

Я пытаюсь использовать свойство elevation в последнем выпуске предварительного просмотра Android Lollipop. Я установил targetSdk в 21 и тему в Material. Затем я добавил фоновое изображение в TextView и установил высоту в 8dp, но TextView не показывает никаких признаков тени. То есть на Nexus7 работает предварительный просмотр Lollipop. Есть ли что-нибудь еще, что я должен рассмотреть?

Вот макет:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent">

  <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:background="@drawable/rect"
      android:text="hallo world"
      android:padding="8dp"
      android:elevation="8dp" />

</LinearLayout>

Это фоновый рисунок:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="rectangle">
    <solid android:color="#7d0073ff" />
    <corners android:radius="16dp" />
</shape>

Вот TextView:

Android elevation

Ответ 1

По какой-то причине, если вы установили сплошной цвет с прозрачностью, тень высоты не появится.

В вашем примере я изменил # 7d0073ff на # 0073ff, и у меня появилась тень.

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

Ответ 2

После просмотра документов снова я нашел решение.

Просто добавьте card_view:cardUseCompatPadding="true" к вашему CardView, и тени появятся на устройствах Lollipop.

Что происходит, область содержимого в CardView принимает разные размеры на устройствах с предварительным леоптипом и леденцом. Таким образом, в устройствах с леденец тень на самом деле покрыта картой, поэтому ее не видно. Добавляя этот атрибут, область содержимого остается неизменной для всех устройств, и тень становится видимой.

Мой xml-код похож:

<android.support.v7.widget.CardView
    android:id="@+id/media_card_view"
    android:layout_width="match_parent"
    android:layout_height="130dp"
    card_view:cardBackgroundColor="@android:color/white"
    card_view:cardElevation="2sp"
    card_view:cardUseCompatPadding="true"
    >
...
</android.support.v7.widget.CardView>

Ответ 3

ДОБАВЛЯЕТ андроид: тень для изображения в ImageView:

android:clipToPadding="false"
+
android:outlineProvider="bounds"
+
android:elevation="2dp"

Ответ 4

У меня также была эта проблема, и, как оказалось, вам нужно включить аппаратное ускорение в манифесте Android.

<application
  ...
  android:hardwareAccelerated="true">

Ответ 5

помните, если в манифесте есть следующая строка, тени не будут отображаться:

Android: hardwareAccelerated = "ложь"

Ответ 6

TL; DR

Проверьте свою карточку: (или любое другое слово, которое вы используете), и убедитесь, что она соответствует этому: xmlns: card = "http://schemas.android.com/apk/res-auto"

Я знаю, что здесь есть несколько ответов, но я хотел добавить мой, поскольку он не был включен в эти текущие предложения. Чтобы получить тени, работающие как на KitKat, так и на Marshmallow (только эмуляторы, которые я пробовал, я уверен, что это работает между ними), я добавил следующие атрибуты xml на свою карточку:

card:cardElevation="25dp"
card:cardUseCompatPadding="true"

После того, как я ударил головой о стол, почему это не работает, пытаясь установить цвет фона карты на что-то совершенно непрозрачное, включив аппаратное ускорение в манифесте и даже молясь, я проверил объявления пространства имен в моем файл. К моему ужасу, я увидел, что пространство имен xml-карты было присвоено следующему:

xmlns:card="http://schemas.android.com/tools"

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

Вот доказательство, если вы сомневаетесь, как я. И, пожалуйста, Google, Android, кто бы то ни было: снова создайте тени. Они не должны быть такими трудными.

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

Вот весь файл, который создал макет, изображенный ниже:

<?xml version="1.0" encoding="utf-8"?>

<!--MAKE SURE YOU HAVE THE RIGHT XML NAMESPACE ASSIGNED-->
<!--TO WHATEVER WORD YOU PUT IN FRONT OF THE CARD-->
<!--XML ATTRIBUTES. IN THIS CASE, MINE IS card-->
<android.support.percent.PercentRelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:card="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#607D8B"
    android:fitsSystemWindows="true"
    tools:context="com.mlustig.playground.MainActivity">

    <android.support.v7.widget.CardView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_centerInParent="true"
        app:layout_aspectRatio="66%"
        app:layout_heightPercent="75%"
        card:cardElevation="25dp"
        card:cardUseCompatPadding="true" />
</android.support.percent.PercentRelativeLayout>

Да, я знаю. Это раздражает, что вы не можете просто скопировать и вставить этот макет и запустить его, потому что в нем есть PercentRelativeLayout, но я оставил его там специально. Вы должны определенно проверить out. Супер мощный, очень полезный. Приятно приятно. Надеюсь, это помогло.

Ответ 7

Как отмечалось ранее, это open bug в Android: если фоновый ресурс использует сплошной цвет с прозрачностью, тогда тень выиграла Не будет показано.

Чтобы обойти проблему, отобразите фон в своем отдельном представлении и установите альфа в этом представлении. Оберните фоновое изображение и TextView в RelativeLayout, чтобы поместить фон непосредственно под TextView и используйте android:layout_alignLeft, android:layout_alignBottom и т.д., Чтобы сделать его того же размера. Они должны быть на одинаковом уровне, и фон должен появиться перед TextView в xml, чтобы он рисовался под ним.

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="40dp"
    android:paddingRight="40dp"
    android:paddingTop="20dp"
    android:paddingBottom="20dp"
    android:clipToPadding="false"
    android:background="#ffffff">

    <View
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/text_view"
        android:layout_alignRight="@id/text_view"
        android:layout_alignBottom="@id/text_view"
        android:layout_alignTop="@id/text_view"
        android:background="@drawable/rect"
        android:alpha="0.5"
        android:elevation="8dp"/>


    <TextView
        android:id="@id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hallo world"
        android:textColor="#ffffff"
        android:padding="8dp"
        android:elevation="8dp" />

</RelativeLayout>

Выбираемый те же, что и ваш, но без прозрачности:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <solid android:color="#0073ff" />
    <corners android:radius="16dp" />
</shape>

Результат:

Результат

Несколько заметных точек:

  • Вы должны убедиться, что охватывающий RelativeLayout достаточно большой, чтобы отобразить тень. Если вы просто установите его размеры на wrap_content без заполнения, тень будет привязана к границам макета. Как объяснено в этом вопросе, вы можете использовать padding и установить android:cipToPadding="false", чтобы сделать его достаточно большим для тени. В этом случае вам может не понадобиться столько отступов, я не экспериментировал с этим.
  • В этом случае нам нужно использовать отдельное представление для фона, потому что, если бы мы установили alpha непосредственно на TextView, тогда текст также был бы затронут. В зависимости от вашего варианта использования вам может не понадобиться отдельный вид и охватывающий макет, и он может просто иметь только один вид, а alpha установлен на вид и прозрачность в drawable.

Ответ 8

Попробуйте использовать: app: cardElevation = "4dp"

Ответ 9

Попробуйте добавить поле к CardView.