70 votes

Android View Clipping

Existe-t-il un moyen de définir la région de clip d'un ViewGroup dans Android (Honeycomb) ? Par exemple, j'ai un ListView avec un fond d'image qui a des coins arrondis. Lorsque je fais défiler la liste, les enfants dépassent les coins de l'arrière-plan. Je préférerais qu'ils s'insèrent dans les coins arrondis. Left: unclipped, Right: clipped

L'image de gauche représente ce qu'il fait actuellement, et celle de droite ce que je voudrais.

Je me suis intéressé à ClipDrawable, mais il semble qu'il ne puisse être utilisé que pour les barres de progression ?

De plus, j'essaie de faire cela dans un widget. Je ne peux donc pas utiliser une vue personnalisée et remplacer onDraw pour le masquage.

Merci !

0 votes

Avez-vous trouvé une solution ? J'essaie également de faire en sorte que cela se produise dans un widget.

6voto

kapil Points 28

Créez une mise en page personnalisée avec overridden onDraw(Canvas canvas)

appelez canvas.clipRect(0, 0, mCanvasWidth, mCanvasHeight);

cela coupera toutes les vues qui sortent des limites de la mise en page.

Et n'oubliez pas d'appeler setWillNotDraw(false) dans le constructeur, donc votre onDraw exécutera

1voto

Simone Casagranda Points 701

Si vous jetez un coup d'œil à WhatsUp vous pouvez voir que dans l'image du contact il y a une image arrondie par une bordure arrondie. Pour ce faire, j'ai placé l'ImageView à l'intérieur d'un FrameLayout (FrameLayout car j'utilise la 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 l'affiner, il faut travailler avec le canvas.

Jetez un autre coup d'œil à ceci enlace cela résoudra votre problème ;)

1voto

Pēteris Caune Points 13662

Que dites-vous de ça ? Comment convertir une vue Android en bitmap ? puis découpez ce bitmap.

Ou, autre idée, utilisez FrameLayout Pour ce faire, empilez votre masque de clips sur le dessus de votre ViewGroup. Le clip mask aura un milieu transparent et des bords opaques.

Dans les deux cas, je suppose qu'il sera délicat de gérer les entrées utilisateur...

0 votes

La première option ne fonctionnerait pas, car il est dans un widget, donc il ne doit utiliser que des vues compatibles avec les RemoteViews.

0 votes

Et pour la deuxième option, puisqu'il s'agit d'un widget pour l'écran d'accueil, un masque à clip ne serait pas viable.

1voto

Bondax Points 1463
Path p = new Path()

// define your clipping path...

canvas.clipPath(p);

0voto

blessenm Points 14700

Vous pouvez peut-être utiliser la méthode Canvas.clipRegion pour découper les différences entre les deux vues.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X