web-dev-qa-db-fra.com

Rayon d'angle CardView

Existe-t-il un moyen de faire en sorte que CardView ait uniquement un rayon de coin en haut?

<Android.support.v7.widget.CardView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    app:cardCornerRadius="10dp"
    >
68
squeeish

Si vous n'essayez pas d'étendre la classe CardView sous Android, vous ne pouvez pas personnaliser cet attribut à partir de XML

Néanmoins, il existe un moyen d'obtenir cet effet.

Placez un CardView dans un autre CardView et appliquez un fond transparent à votre CardView extérieur et supprimez son rayon de coin ("cornerRadios = 0dp"). Votre CardView interne aura une valeur cornerRadius de 3dp, par exemple. Appliquez ensuite un marginTop à votre CardView intérieur afin que ses limites inférieures soient coupées par le CardView extérieur. De cette façon, le rayon du coin inférieur de votre CardView intérieur sera masqué. 

Le code XML est le suivant:

 <Android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/card_view_outer"
    Android:layout_width="match_parent"
    Android:layout_height="200dp"
    Android:layout_gravity="center"
    card_view:cardBackgroundColor="@Android:color/transparent"
    card_view:cardCornerRadius="0dp"
    card_view:cardElevation="3dp" >

    <Android.support.v7.widget.CardView
        xmlns:card_view="http://schemas.Android.com/apk/res-auto"
        Android:id="@+id/card_view_inner"
        Android:layout_width="match_parent"
        Android:layout_height="200dp"
        Android:layout_gravity="center"
        Android:layout_marginTop="3dp"
        card_view:cardBackgroundColor="@color/green"
        card_view:cardCornerRadius="4dp"
        card_view:cardElevation="0dp" >
    </Android.support.v7.widget.CardView>
</Android.support.v7.widget.CardView>

Et l'effet visuel est le suivant:

CardView with rounded corners only on top

Mettez toujours votre contenu dans votre CardView intérieur. Votre CardView externe sert uniquement à "masquer" les coins arrondis inférieurs de la CardView intérieure.

87
joao2fast4u
dependencies: compile 'com.Android.support:cardview-v7:23.1.1'

<Android.support.v7.widget.CardView
    Android:layout_width="80dp"
    Android:layout_height="80dp"
    Android:elevation="12dp"
    Android:id="@+id/view2"
    app:cardCornerRadius="40dp"
    Android:layout_centerHorizontal="true"
    Android:innerRadius="0dp"
    Android:shape="ring"
    Android:thicknessRatio="1.9">
    <ImageView
        Android:layout_height="80dp"
        Android:layout_width="match_parent"
        Android:id="@+id/imageView1"
        Android:src="@drawable/Your_image"
        Android:layout_alignParentTop="true"
        Android:layout_centerHorizontal="true">
    </ImageView>
</Android.support.v7.widget.CardView>
25
shreedhar bhat

J'ai écrit une bibliothèque tirable à la position du coin arrondi personnalisé, il ressemble à ceci:

 example.png

Vous pouvez obtenir cette bibliothèque ici:

https://github.com/mthli/Slice

5
mthli

Vous pouvez utiliser ce fichier XML dessinable et définir comme arrière-plan cardview: 

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <solid Android:color="#ffffffff"/>

    <stroke Android:width="1dp"
        Android:color="#ff000000"
        />

    <padding Android:left="1dp"
        Android:top="1dp"
        Android:right="1dp"
        Android:bottom="1dp"
        />

    <corners 
        Android:topLeftRadius="7dp"
        Android:topRightRadius="7dp"/>
</shape>
5
Surender Kumar

Voici un exemple de réalisation, lorsque la carte est tout en bas de l'écran. Si quelqu'un a ce genre de problème, faites quelque chose comme ça:

<Android.support.v7.widget.CardView
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_marginBottom="-5dp"
    card_view:cardCornerRadius="4dp">

    <SomeView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginBottom="5dp">

    </SomeView>

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

La vue de carte a une marge inférieure négative. La vue dans une vue de carte a la même marge inférieure, mais positive. De cette façon, les parties arrondies sont cachées sous l'écran, mais tout a exactement la même apparence, car la vue interne a une marge de comptage.

4
koras

Vous devez faire 2 choses:

1) Appelez setPreventCornerOverlap(false) sur votre CardView.

2) Placez arrondi ImageView dans CardView

À propos de l’arrondissement de votre imageview, j’avais le même problème et j’ai donc créé une bibliothèque sur laquelle vous pouvez définir rayons différents à chaque angle. Enfin, j'ai obtenu le résultat que je voulais comme ci-dessous.

https://github.com/pungrue26/SelectableRoundedImageView

Rounded ImageView inside CardView

2
김준호

Un moyen facile d'y parvenir serait: 

1.Faites une ressource d’arrière-plan personnalisée (comme une forme de rectangle) avec des coins arrondis.

2.set cet arrière-plan personnalisé en utilisant la commande -

cardView = view.findViewById(R.id.card_view2);
cardView.setBackgroundResource(R.drawable.card_view_bg);

cela a fonctionné pour moi.

La disposition XML que j'ai faite avec le rayon en haut à gauche et en bas à droite.

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<solid Android:color="@color/white" />
<corners Android:topLeftRadius="18dp" Android:bottomRightRadius="18dp" />
</shape>

Dans votre cas, vous devez modifier uniquement topLeftRadius ainsi que topRightRadius.

Si vous avez une mise en page qui chevauche les coins de la vue de carte et a une couleur différente, vous aurez peut-être besoin d'un fichier de ressources d'arrière-plan différent pour la mise en page et définissez dans xml cette ressource en arrière-plan.

J'ai essayé et testé la méthode ci-dessus. J'espère que cela vous aide.

0
Ankit Deshmukh

Si vous configurez l’arrière-plan de la carte par programmation, utilisez plutôt cardView.setCardBackgroundColor() et non cardView.setBackgroundColor() et assurez-vous que vous utilisez app:cardPreventCornerOverlap="true" sur le fichier cardView.xml. Cela a réglé le problème pour moi.

Au fait, le code ci-dessus (entre guillemets) est en Kotlin et non en Java. Utilisez l'équivalent Java si vous utilisez Java.

0
Joseph Magara

vous pouvez utiliser la bibliothèque: OptionRoundCardview

 enter image description here

0
qinmiao