5

Giocare con il widget Android Support Library v7 CardView Vedo risultati diversi su un Galaxy S4 rispetto a un dispositivo Nexus 4. Avere la seguente disposizione:Diversi risultati di CardView della libreria di supporto Android su diversi dispositivi

<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:id="@+id/card_view" 
    android:layout_width="fill_parent" 
    android:layout_height="150dp" 
    android:layout_gravity="center" 
    android:layout_marginTop="8dp" 
    android:layout_marginBottom="10dp" 
    android:layout_marginLeft="20dp" 
    android:layout_marginRight="20dp" 
    android:orientation="horizontal" 
    card_view:cardCornerRadius="7dp" 
    card_view:cardElevation="12dp"> 

    <ScrollView 
     android:id="@+id/scrollView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentStart="true" 
     android:layout_centerVertical="true"> 

     <TextView 
      android:id="@+id/txtExample" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/no_messages" /> 

    </ScrollView> 

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

ho ottenuto questi risultati:

Nexus 4 (5.0.1): enter image description here

Samsung Galaxy S4 (4.4.2): enter image description here

Sembra che quello su Nexus calcoli la vista con i suoi margini, e quindi il dipinge l'ombra all'esterno. D'altra parte, quello di Samsung sembra applicare i margini e quindi dipingere l'ombra all'interno fino a raggiungere i limiti della vista calcolata.

Mi manca qualcosa?

risposta

8

Tutte le tue osservazioni sono corrette :)
Tutto è spiegato bene ufficiale documentation of CardView:

Prima L, CardView aggiunge imbottitura per il suo contenuto e disegna ombre per quella zona. Questo importo di riempimento è uguale a maxCardElevation + (1 - cos45) * cornerRadius sui lati e maxCardElevation * 1.5 + (1 - cos45) * cornerRadius in alto e in basso.

e:

noti che, se si specificano le dimensioni esatte per la CardView, perché delle ombre, la sua area di contenuto sarà diverso tra le piattaforme prima e dopo L L. Utilizzando api valori di risorsa specifici della versione, è possibile evitare queste modifiche. In alternativa, se si desidera CardView su aggiungere padding interno sulle piattaforme L e dopo, è possibile impostare setUseCompatPadding (booleano) su true.

Come descritto lì - si deve solo usare setUseCompatPadding (true) imbottitura poi esterno su entrambi: L e pre-L sarà lo stesso.

+0

Avevi ragione, Maciej! Saluti – GoRoS