Configuração de elevação em XML no AppCompat CardView no Android 5.0

95

Pelo que entendi, no início do estágio de visualização parecia não haver maneira de definir a elevação em XML apenas em CardViews sem um hack em Java. Agora que o lançamento oficial foi lançado, há alguma maneira de fazer isso em XML sem escrever o código Java para definir a elevação?

Eu tentei card_view:cardElevationsem efeito. Eu pensei que quando estava usando os emuladores do 5.0 estava tudo bem. Mas agora que estou usando a versão oficial no meu dispositivo real, todos os meus CardViews desapareceram

Pré Lollipop, funciona muito bem.

Aqui está meu xml completo

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:id="@+id/cv1"
    card_view:cardElevation="4dp"
    android:layout_margin="6dp"
    card_view:cardCornerRadius="3dp"
    android:layout_height="match_parent">
TheLettuceMaster
fonte
Já resolvi o problema, mas ainda não tenho uma resposta. Quando eu atualizei para o pirulito, de alguma forma as margens ou preenchimento desapareceram para que eles não vissem os cantos ou as bordas do cartão, por isso é completamente plano.
TheLettuceMaster de

Respostas:

316

Parece um problema de margem / preenchimento, tente definir o atributo cardUseCompatPadding como true. Por exemplo:

<android.support.v7.widget.CardView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="6dp"
    card_view:cardUseCompatPadding="true"
    card_view:cardElevation="4dp"
    card_view:cardCornerRadius="3dp">

Explicação do documento Android:

CardView adiciona preenchimento adicional para desenhar sombras nas plataformas antes de L.

Isso pode fazer com que os cartões tenham tamanhos diferentes entre L e antes de L. Se você precisa alinhar o CardView com outras visualizações, pode precisar de recursos de dimensão específicos da versão da API para contabilizar as alterações. Como alternativa, você pode definir o sinalizador cardUseCompatPadding como true e CardView adicionará os mesmos valores de preenchimento nas plataformas L e posteriores.

Como configurar o sinalizador cardUseCompatPadding como true adiciona lacunas desnecessárias na IU, o valor padrão é false.

Gaëtan M.
fonte
1
card_view: cardUseCompatPadding = "true" fez a elevação funcionar, mas também adicionou um monte de preenchimento ....
Taylor
1
qual é o valor padrão de cardElevation?
desenvolvedor Android de
13

Se você tem esta linha

android:hardwareAccelerated="false"

na tag do aplicativo de manifesto, suas sombras não foram exibidas. tente remover esta linha

ou usar

android:hardwareAccelerated="true"

Isso funcionou para mim! Eu espero que funcione para você também :)

Matin Ashtiani
fonte
sim! esse era o problema !! muito obrigado! mas não devido à imagem de bitmap que usei como plano de fundo, o aplicativo fica lento :(
Kaushal28
13

Você tem que usar o cardElevationatributo.
Bibliotecas Androidx:

Você pode usar o MaterialCardincluído na biblioteca oficial de componentes de materiais :

implementation 'com.google.android.material:material:1.x.x'

E em seu layout:

    <com.google.android.material.card.MaterialCardView
        app:cardElevation="xxdp"
        app:cardUseCompatPadding="true"
        ..>

Ou CardViewnos pacotes androidx:

implementation 'androidx.cardview:cardview:1.x.x'

E em seu layout:

     <androidx.cardview.widget.CardView
        app:cardElevation="xxdp"
        app:cardUseCompatPadding="true"
        ..>

Biblioteca de suporte ANTIGA :

<android.support.v7.widget.CardView
    app:cardElevation="xxdp" 
    app:cardUseCompatPadding="true"
    ..>
Gabriele Mariotti
fonte
1
Não, tentei de novo e não funcionou. Eu adicionei meu xml completo em cima.
TheLettuceMaster de
Funciona para mim. Qual é a elevação padrão?
SMBiggs de
Elevação Elevação de descanso da placa: 2dp Elevação elevada da placa: Cartões de 8dp têm uma elevação padrão de 2dp. No desktop, os cartões podem ter uma elevação de repouso de 0 dp e ganhar uma elevação de 8 dp ao pairar. De google.com/design/spec/components/…
ZimaXXX
está descontinuado
Makarand
1
@Makarand True. A biblioteca de design não é mais mantida, mas respondi a essa pergunta há 5 anos. Em qualquer caso, atualizei a resposta com os detalhes do andriodx.
Gabriele Mariotti
1

Isso me resolveu adicionando

xmlns: card_view = "http://schemas.android.com/apk/res-auto"

por exemplo:

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="5dp"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    card_view:cardCornerRadius="5dp">
Felhi
fonte
0

Estou adicionando um atributo app: cardElevation = "8dp" na visualização do cartão, então será como:

<android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="160dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="24dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        app:cardElevation="8dp"
        app:cardCornerRadius="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scaleType="centerCrop"
            android:src="@drawable/kmp_warna1" />

    </android.support.v7.widget.CardView>

Espero que ajude

Cevin Ways
fonte