Comment faire un afficher avec des coins arrondis?
Je suis en train de faire une vue sur android avec des bords arrondis. La solution que j'ai trouvé pour l'instant est de définir une forme avec des coins arrondis et de l'utiliser comme arrière-plan de ce point de vue.
Voici ce que j'ai fait, de définir un drawable comme indiqué ci-dessous:
<padding
android:top="2dp"
android:bottom="2dp"/>
<corners android:bottomRightRadius="20dp"
android:bottomLeftRadius="20dp"
android:topLeftRadius="20dp"
android:topRightRadius="20dp"/>
Maintenant, j'ai utilisé ce que le fond de ma mise en page comme ci-dessous:
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="10dp"
android:clipChildren="true"
android:background="@drawable/rounded_corner">
Cela fonctionne parfaitement bien, je peux voir que la vue a des bords arrondis.
Mais ma mise en page a obtenu de nombreuses autres vues enfant en elle, dire une ImageView ou un MapView
. Quand je place un ImageView
à l'intérieur de la disposition ci-dessus, les coins de l'image sont pas coupés/recadrée, au contraire, il semble complet.
J'ai vu d'autres solutions de contournement pour le faire fonctionner comme on l'a expliqué ici.
Mais est-il une méthode pour définir des coins arrondis pour une vue et de tous ses
enfant vues sont contenues à l'intérieur de cette fenêtre principale qui a arrondi
les coins?
- Si vous utilisez une mise en page Personnalisée s'étendant à LinearLayout, et alors que son objet est créé, itérer tous les enfants de cet Agencement et l'appliquer aux bords arrondis arrière-plan pour eux?
- android.de soutien.v7.widget de.CardView semblent être la solution pour cela
- Cette solution résolu pour moi, mais nécessite de sous-classement: https://stackoverflow.com/questions/5574212/android-view-clipping
Vous devez vous connecter pour publier un commentaire.
Une autre approche est de faire une mise en page personnalisée de classe comme celle ci-dessous. Cette disposition attire d'abord son contenu à l'écran bitmap, des masques à l'écran bitmap avec un arrondi rect et puis dessine les limites de l'écran bitmap sur la toile.
Je l'ai essayé et il semble fonctionner (au moins pour mon simple cas de test). Il sera bien sûr affecter les performances par rapport à un plan régulier.
L'utiliser comme une normale de mise en page:
android:elevation
attribut il peut rendre l'ombre de manière incorrecte. Pour corriger ce problème, voir ce gist sur GithubOu vous pouvez utiliser un
android.support.v7.widget.CardView
comme suit:shape.xml
et à l'intérieur de vous disposition
Si vous éprouvez des problèmes lors de l'ajout de toucher les auditeurs de la mise en page. Utiliser cette mise en page en tant que parent de mise en page.
comme
Jaap van Hengstum réponse fonctionne très bien cependant, je pense que c'est cher et si l'on applique cette méthode sur un Bouton par exemple, le toucher de l'effet est perdu car la vue est rendue sous la forme d'une image bitmap.
Pour moi, la meilleure méthode et la plus simple, consiste dans l'application d'un masque sur la vue, comme ça:
path
ne peut pas être résolu.Créer un fichier xml appelé
round.xml
dans ledrawable
dossier et coller ce contenu:puis utilisez le
round.xml
commebackground
à n'importe quel élément. Ensuite, il vous donnera des coins arrondis.Dans Android L, vous serez en mesure de simplement utiliser Vue.setClipToOutline pour obtenir cet effet. Dans les versions précédentes il n'y a aucun moyen de le clip le contenu d'un hasard ViewGroup dans une certaine forme.
Vous devrez penser à quelque chose qui vous donnent un effet similaire:
Si vous avez uniquement besoin des coins arrondis dans le ImageView, vous pouvez utiliser un shader "peindre" l'image sur la forme que vous êtes en utilisant comme toile de fond. Jetez un oeil à cette bibliothèque pour un exemple.
Si vous avez vraiment besoin de tous les enfants à être coupé, vous pouvez peut-être un autre point de vue sur votre mise en page? L'un avec un fond de quelle que soit la couleur que vous utilisez, et un tour de "trou" dans le milieu? Vous pouvez réellement créer un personnalisé ViewGroup qui attire qui forme plus de tous les enfants de la substitution de la méthode onDraw.
La
CardView
a travaillé pour moi dans l'API 27 dans Android Studio 3.0.1. LecolorPrimary
a été référencé dans leres/values/colors.xml
fichier et est juste un exemple. Pour le layout_width de0dp
il s'étendra à la largeur du parent. Vous devrez configurer les contraintes et la largeur/hauteur de vos besoins.Créer un fichier xml sous votre dossier drawable avec le code suivant. (Le nom du fichier que j'ai créé est rounded_corner.xml)
rounded_corner.xml
Et de garder cette drawable comme arrière-plan de la vue à laquelle vous voulez garder à coins arrondis de la frontière. Nous allons garder pour un LinearLayout
suivre ce tutoriel et de toutes les discussions dessous -
http://www.curious-creature.org/2012/12/11/android-recipe-1-image-with-rounded-corners/
selon ce post écrit par Guy Romain, l'un des principaux promoteurs de l'ensemble de l'INTERFACE utilisateur Android trousse à outils, il est possible de faire un conteneur (et tous ses vues enfant) avec des coins arrondis, mais il a expliqué que c'est trop cher (à partir de représentations de problèmes d'affichage).
Je vous recommande d'aller selon son poste, et si vous voulez des coins arrondis, puis de mettre en œuvre des coins arrondis
ImageView
selon ce post. ensuite, vous pouvez le placer dans un récipient avec de l'arrière-plan, et vous allez obtenir l'effet que vous souhaitez.c'est ce que j'ai fait aussi finalement.
Le tutoriel lien que vous avez fourni semble suggérer que vous devez définir la layout_width et layout_height propriétés de votre enfant les éléments de match_parent.
Différence de Jaap van Hengstum réponse:
essayer cette propriété avec votre linéaire de la mise en page, il aidera
outils:context=".youractivity"
Utilisation de la forme en xml avec le rectangle.définissez la propriété du bas ou du haut du rayon les souhaitez.appliquez ensuite le format xml comme arrière-plan pour ur la vue....ou...utiliser des dégradés de le faire à partir du code.