web-dev-qa-db-fra.com

Android Afficher le découpage

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. Left: unclipped, Right: clipped

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!

54
Jon Ross

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".

24
head in the codes

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

5
kapil

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);
4
Marco

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;)

1
Simone Casagranda
Path p = new Path()

// define your clipping path...

canvas.clipPath(p);
1
Bondax

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 ...

1
Pēteris Caune

Peut-être que vous pouvez utiliser la méthode Canvas.clipRegion pour couper les différences des vues to.

0
blessenm