Impostazione dell'elevazione in XML su AppCompat CardView su Android 5.0


95

Da quello che ho capito, all'inizio della fase di anteprima non sembrava esserci alcun modo per impostare l'elevazione in XML solo su CardViews senza un hack in Java. Ora che è uscito il rilascio ufficiale, c'è un modo per farlo in XML senza scrivere codice Java per impostare l'elevazione?

Ho provato card_view:cardElevationsenza alcun risultato. Avevo pensato che quando stavo usando gli emulatori per 5.0 tutto andava bene. Ma ora che sto usando la versione ufficiale sul mio dispositivo attuale, tutti i miei messaggi sono CardViewscomparsi

Pre Lollipop, funziona benissimo.

Ecco il mio 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">

Ho risolto il problema ma non ho ancora una risposta. Quando ho aggiornato a lollipop, in qualche modo i margini o il riempimento sono scomparsi in modo che non vedessero gli angoli oi bordi della carta, quindi è completamente piatta.
TheLettuceMaster

Risposte:


316

Sembra un problema di margine / riempimento, prova a impostare l' attributo cardUseCompatPadding su true. Per esempio:

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

Spiegazione dal documento Android:

CardView aggiunge imbottitura aggiuntiva per disegnare ombre sulle piattaforme prima di L.

Ciò potrebbe far sì che le carte abbiano dimensioni diverse tra L e prima di L. Se è necessario allineare CardView con altre viste, potrebbero essere necessarie risorse di dimensione specifiche della versione API per tenere conto delle modifiche. In alternativa, puoi impostare il flag cardUseCompatPadding su true e CardView aggiungerà gli stessi valori di riempimento sulle piattaforme L e successive.

Poiché l'impostazione del flag cardUseCompatPadding su true aggiunge spazi non necessari nell'interfaccia utente, il valore predefinito è false.


1
card_view: cardUseCompatPadding = "true" ha ottenuto l'elevazione per funzionare ma ha aggiunto anche un po 'di imbottitura ...
Taylor

1
qual è il valore predefinito della cardElevation?
sviluppatore Android

13

Se hai questa linea

android:hardwareAccelerated="false"

nel tag dell'applicazione manifest le tue ombre non venivano visualizzate. prova a rimuovere questa linea

o utilizzare

android:hardwareAccelerated="true"

Questo ha funzionato per me! Spero che funzioni anche per te :)


si! quello era il problema !! grazie mille! ma non a causa dell'immagine bitmap che ho usato per lo sfondo, l'app viene rallentata :(
Kaushal28

13

Devi usare l' cardElevationattributo.
Librerie Androidx:

È possibile utilizzare il MaterialCardcontenuto nella libreria ufficiale dei componenti dei materiali :

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

E nel tuo layout:

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

O CardViewnei pacchetti androidx:

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

E nel tuo layout:

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

VECCHIA libreria di supporto :

<android.support.v7.widget.CardView
    app:cardElevation="xxdp" 
    app:cardUseCompatPadding="true"
    ..>

1
No, ho provato di nuovo e non ha funzionato. Ho aggiunto il mio xml completo in alto.
TheLettuceMaster

Per me va bene. Qual è l'elevazione predefinita?
SMBiggs

Elevazione Elevazione di riposo della scheda: 2dp Elevazione della scheda sollevata: 8dp Le carte hanno un'elevazione predefinita di 2dp. Sul desktop, le schede possono avere un'elevazione a riposo di 0dp e ottenere un'elevazione di 8dp al passaggio del mouse. Da google.com/design/spec/components/…
ZimaXXX

è deprecato
Makarand

1
@ Makarand True. La libreria di design non è più mantenuta ma ho risposto a questa domanda 5 anni fa. In ogni caso ho aggiornato la risposta con i dettagli di andriodx.
Gabriele Mariotti

1

Mi ha risolto aggiungendo

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

per esempio:

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

0

Sto aggiungendo un'app: attributo cardElevation = "8dp" nella visualizzazione schede, quindi sarà come:

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

Spero che possa aiutare

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.