Existe-t-il un moyen de définir la zone de découpage d'un ViewGroup dans Android (Honeycomb)? Par exemple, j'ai une ListView avec un arrière-plan d'image aux coins arrondis. En faisant défiler la liste, les enfants dépassent des coins de l'arrière-plan - je préférerais qu'ils se clipsent dans les coins arrondis.
L'image de gauche est ce qu'elle fait actuellement et la droite est ce que j'aimerais.
Je regardais ClipDrawable, mais il semble que cela ne puisse être utilisé que pour les barres de progression?
En outre, j'essaie de le faire dans un widget. Je ne peux donc pas utiliser une vue personnalisée et remplacer onDraw pour le masquage.
Je vous remercie!
Essayez de sous-classer ViewGroup et de remplacer la méthode OnDraw comme suit, en substituant dans les valeurs RADIUS_IN_PIXELS:
@Override
protected void onDraw(Canvas canvas) {
Path clipPath = new Path();
clipPath.addRoundRect(new RectF(canvas.getClipBounds()), RADIUS_IN_PIXELS, RADIUS_IN_PIXELS, Path.Direction.CW);
canvas.clipPath(clipPath);
super.onDraw(canvas);
}
... et créez également un dessin personnalisé comme celui-ci appelé quelque chose comme 'arrondi', en le remplaçant dans YOUR_BACKGROUND_COLOR et RADIUS_IN_DP, en veillant à faire correspondre l'arrondi du rectangle dans DP à votre rayon de détourage précédent dans PX:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<corners Android:radius="RADIUS_IN_DP" />
<solid Android:color="YOUR_BACKGROUND_COLOR"/>
</shape>
Ensuite, vous pouvez utiliser cette sous-classe dans votre mise en page, en ajoutant les lignes
Android:background="@drawable/rounded"
Android:clipChildren="true"
Tous les enfants seront coupés aux limites que vous spécifiez dans la substitution OnDraw (), et un arrière-plan sera ajouté en fonction de votre dessin "arrondi".
Créer une mise en page personnalisée avec overridden onDraw(Canvas canvas)
appeler canvas.clipRect(0, 0, mCanvasWidth, mCanvasHeight);
cela supprimera toutes les vues qui sortent des limites de la disposition.
Et n'oubliez pas d'appeler setWillNotDraw(false)
dans le constructeur, donc votre onDraw s'exécutera
Assurez-vous que layout
a un arrière-plan avec des coins arrondis.
Kotlin
layout.outlineProvider = ViewOutlineProvider.BACKGROUND
layout.clipToOutline = true
Java
layout.setOutlineProvider(ViewOutlineProvider.BACKGROUND);
layout.setClipToOutline(true);
Si vous jetez un oeil à WhatsUp vous pouvez voir que dans l'image de contact il y a une image arrondie par une bordure arrondie. Pour ce faire, j'ai mis ImageView dans un FrameLayout (FrameLayout car j'utilise ProgressBar devant l'image pour notifier le chargement [en fait invisible]) qui a une bordure arrondie. L'image a une forme carrée mais pour la raffiner, vous devez travailler avec du canevas.
Jetez un autre coup d'oeil à ceci link qui résoudra votre problème;)
Path p = new Path()
// define your clipping path...
canvas.clipPath(p);
Que pensez-vous de cela: Comment rendre un Android vue sur un bitmap , puis clip ce bitmap.
Ou, une autre idée, utilisez FrameLayout
, empilez votre masque de clip sur votre ViewGroup. Le masque d'agrafe aurait des bordures intermédiaires transparentes et opaques.
Dans les deux cas, je suppose qu'il sera difficile de gérer les entrées des utilisateurs ...
Peut-être que vous pouvez utiliser la méthode Canvas.clipRegion pour couper les différences des vues to.