2016-10-19 4 views
1

J'ai un ViewGroup qui consiste en un en-tête et un cercle d'éléments de menu. Fondamentalement, j'ai une animation de fermeture/ouverture où les vues de mes articles vont derrière la vue d'en-tête. Comme toutes les vues ont des transparences, lorsque les vues d'élément passent derrière la vue d'en-tête, elles sont toujours visibles et finissent par apparaître derrière la vue d'en-tête à travers les transparents. Ce que je voulais faire est de recouper les vues d'articles avec la vue hweader, en effaçant l'intersection. Ce que je suis venu avec était de remplacer dispatchDraw et faire quelque chose comme PorterDuff.Mode.CLEARDessiner devant certaines vues enfant

Mais je ne peux le faire à toutes les vues à la fois, dans le sens. En utilisant le code ci-dessous, il effacera tout ce qui a été dessiné dans la vue dans cette zone spécifique, donc l'en-tête.

@Override 
protected void dispatchDraw(Canvas canvas) { 
    super.dispatchDraw(canvas); 
    //do stuff here 
} 

Y at-il un moyen de retravailler la vue ou même de sélectionner les vues que je veux effacer?

Répondre

1

Juste pour référence future, c'est ce que j'ai fait. Remplacer le tirage au sort, effacer la zone donnée et dessiner à nouveau l'enfant avec

@Override 
protected void dispatchDraw(Canvas canvas) { 
    super.dispatchDraw(canvas); 
    Paint p = new Paint(); 
    p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
    canvas.drawCircle((float) center.x, (float) center.y, headerSize/2, p); 
    canvas.save(); 
    canvas.translate(padding, padding); 
    getChildAt(0).draw(canvas); 
    canvas.restore(); 
}