2015-03-16 14 views
16

Hier sind zwei Bilder.CardView hat zusätzlichen Rand in jeder Kante auf Pre-Lollipop

auf Lollipop: on Lollipop:

auf Pre-Lollipop: on Pre-Lollipop

können wir sehen, dass es auf der Bildschirmseite auf Lollipop gerade in der Nähe ist. das ist, was ich will. Auf dem Pre-Lollipop-Gerät hat es jedoch einen zusätzlichen Rand zur Bildschirmkante. Habt ihr irgendwelche Erfahrungen? Danke.

hier ist die xml-Layout:

<android.support.v7.widget.CardView 
     android:id="@+id/card_title_schedule" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_centerVertical="true" 
     app:cardCornerRadius="0dp" 
     app:cardBackgroundColor="@color/colorAccent" 
     > 
+0

jemand weiß ?. .. –

Antwort

16

So, hier geht es völlig in Ordnung, auf Kitkat, Samsung Gerät um genau zu sein.

Ich versuchte card_view:cardUseCompatPadding="true" aber keinen Nutzen. Hat nicht funktioniert!

Dann entdeckte ich von einem stackoverflow post diese card_view:cardPreventCornerOverlap="false" und VOILA! Hat funktioniert! Es gab keine runden Ecken (Da wollte ich keine, da die Karte einen Bildhintergrund hat).

Die Moral ist, eine extra Polsterung ist wegen dieser kleinen runden Ecken, die deaktiviert werden müssen. Im Grunde genommen ist das kein Schönheitsfehler, sondern ein Designzwang!

ORIGINAL SOF REPLY

Image: Beachten Sie, dass obere Ecken sind Kanten (eine Ansicht, die Farbe und ein Bild im Hintergrund hat), während unten und somit nur Textviews keine Hintergründe hat, die runden Ecken. Das heißt, wenn eine Ansicht innerhalb des CardView anfordert, wird card_view:cardPreventCornerOverlap="false" erlauben, dass das an den betroffenen Ecken aufgenommen wird.

enter image description here

+0

Es funktioniert in dieser Support-Bibliothek, indem Sie es in false ändern. Ich denke, es kann sein, dass Google es stillschweigend behoben hat. –

+0

@JerryGu Ja, Sie haben Recht. – sud007

+0

Danke; Dies machte das Problem viel weniger auffällig, aber auf meinem Sony Xperia M (Android 4.1.2) gab es noch ein oder zwei Pixel Rand/Padding um das "cardView". – Sam

13

Vor L, fügt CardView Polsterung dessen Inhalt und zieht Schatten auf diesem Gebiet. Dieser Auffüllbetrag entspricht maxCardElevation + (1 - cos45) * cornerRadius an den Seiten und maxCardElevation * 1.5 + (1 - cos45) * cornerRadius oben und unten.

Vom CardView Referenz here

Versuchen einen negativen linken Rand auf der CardView wie diese

<android.support.v7.widget.CardView android:id="@+id/card_title_schedule" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_centerVertical="true" app:cardCornerRadius="0dp" app:cardBackgroundColor="@color/colorAccent" app:cardUseCompatPadding="true" android:layout_marginLeft="-2dp" />

Einstellung Möglicherweise müssen Sie den Rand anzupassen um das gewünschte Ergebnis zu erhalten.

PS, das ist eine Art Hack-y-Art, es zu tun.

+0

danke für deine Antwort. Du hast recht. Ich habe nicht bemerkt, dass die "Schatten zu diesem Bereich ziehen". Vielleicht ist der Hack-Weg der einzige bisher. oder ich sollte CardView nicht in diesem Zustand benutzen. –

+0

Gern geschehen. Das ist der einzige Weg, an den ich gerade denken kann. Wenn Sie eine bessere Möglichkeit finden, Schatten auf Pre-Lollipop-Geräten zu zeichnen, lassen Sie es mich wissen. ** BEARBEITEN: ** Hier ist etwas, in das ich gerade jetzt geriet: https: // github.com/dmytrodanylyk/shadow-layout Ich denke, es zieht Schatten auf die gleiche Weise obwohl. Fühlen Sie sich frei, es auszuprobieren. – shemarcl

+0

Ja, das habe ich auch gefunden. Danke. –

12

mit card_view:cardUseCompatPadding="true"

Versuchen Sie, wenn wir diese Eigenschaft auf true dann Marge funktioniert gleiche auf allen Versionen eingestellt.

Entwickler note

Add padding in API v21 + als auch mit früheren Versionen die gleichen Maße haben.

Quelle docs

4

Um das „Schattenraum“ -Ausgabe für PRE-L-Versionen zu lösen, können Sie dynamisch die CardView Marge um negative Werte zu aktualisieren, den Raum zu kompensieren.

Um den tatsächlichen Schatten Raum zu erhalten:

shadowSpaceLeft = getPaddingLeft() - getContentPaddingLeft(); 

den Rand zu beheben:

layoutParams.leftMargin -= shadowSpaceLeft; 

Dies wird für alle Android-Versionen arbeiten, da wir die padding-Werte werden immer und die contentPadding Werte dynamisch.

Zum Beispiel, hier ist eine Klasse, die es tut, wenn wir neues Layout params gesetzt:

public class NoPaddingCardView extends CardView { 

    public NoPaddingCardView(Context context) { 
     super(context); 
     init(); 
    } 

    public NoPaddingCardView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public NoPaddingCardView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(); 
    } 

    private void init() { 
     // Optional: Prevent pre-L from adding inner card padding 
     setPreventCornerOverlap(false); 
     // Optional: make Lollipop and above add shadow padding to match pre-L padding 
     setUseCompatPadding(true); 
    } 

    @Override 
    public void setLayoutParams(ViewGroup.LayoutParams params) { 
     // FIX shadow padding 
     if (params instanceof MarginLayoutParams) { 
      MarginLayoutParams layoutParams = (MarginLayoutParams) params; 
      layoutParams.bottomMargin -= (getPaddingBottom() - getContentPaddingBottom()); 
      layoutParams.leftMargin -= (getPaddingLeft() - getContentPaddingLeft()); 
      layoutParams.rightMargin -= (getPaddingRight() - getContentPaddingRight()); 
      layoutParams.topMargin -= (getPaddingTop() - getContentPaddingTop()); 
     } 

     super.setLayoutParams(params); 
    } 
} 
8

Ich weiß, das bereits beantwortet wurde, aber ich möchte, dass zu card_view:cardPreventCornerOverlap="false" zusätzlich hinzufügen, hatte ich auch CardView.setMaxCardElevation(0) einstellen der Ränder auf Pre-Lollipop loszuwerden. Das Einstellen der Höhe auf 0 hat nicht funktioniert. Ich verwende die Support-Bibliothek v23.4.0.

+1

Danke für ** "setMaxCardElevation" ** Zeiger. In meinem Fall Um "extra" Polsterung von allen Kanten _ (gerade wenn es auf CardView oder seinen Kindern keinen Eckenradius gab) _ musste ich diese 3 (in xml) setzen: "app: cardMaxElevation =" 0dp "app: cardElevation =" 0dp "app: cardPreventCornerOverlap =" false "' ... Verwenden von ** com.android.support: cardview-v7: 25.2.0 ** –

3

Wenn das Android 4 (Pre-Lollipop) Verhalten gewünscht wird, sollte app:cardUseCompatPadding="true" zu CardView behoben werden.

Wenn das Verhalten von Android 5+ gewünscht ist (was eigentlich das richtige Verhalten von Kartenansichten gemäß Materialrichtlinien ist), kann genau dasselbe nicht einfach erreicht werden. Normalerweise verwende ich dieses Update mehrere Layout-Dateien zu vermeiden, definieren und haben vernünftige Ausgabe auf allen Geräten:

<android.support.v7.widget.CardView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    app:contentPaddingRight="@dimen/fix_cardview" 
    app:contentPaddingLeft="@dimen/fix_cardview" 
    app:contentPaddingTop="@dimen/fix_cardview_vertical" 
    app:contentPaddingBottom="@dimen/fix_cardview_vertical" /> 

und in normalen values/dimens.xml Datei sollten wir haben:

<dimen name="fix_cardview">-8dp</dimen> 
<dimen name="fix_cardview_vertical">-12dp</dimen> 

und in values-v21/dimens.xml:

<dimen name="fix_cardview">0dp</dimen> 
<dimen name="fix_cardview_vertical">0dp</dimen> 

Beachten Sie, dass die Nummern -8dp und möglicherweise für Ihr Layout angepasst werden müssen, da sie von e abhängen levation usw.

Dies ist nur eine Behelfslösung hässlich Polsterungen in Android 4 Aufrufe zu vermeiden, ohne unterschiedliche Ansichten in verschiedenen Layout-Dateien zu verwenden (was in der Regel macht den Code schwer aufrecht zu erhalten)

Verwandte Themen