2016-07-19 1 views
0

Existe-t-il un moyen pour Android (à partir de l'API 15) de couper/soustraire des vues comme le masquage dans Photoshop?Clipping/soustraction de l'affichage Android

Voir l'exemple ci-dessous: https://s31.postimg.org/d18lktjq3/index.jpg

La vue rouge est juste une drôle de forme audacieuse V, tandis que le bleu est quelque chose de plus complexe. Notez que dans la vue rouge, la partie rayée est transparente. La vue de résultat que je voudrais obtenir, est quelque chose comme la grande vue bleue, avec la forme en V de la deuxième vue, et tout ce qui est au-dessus découpé.

Notez que, dans le résultat final, l'espace "à l'intérieur" de la forme en V doit être transparent.

Actuellement, j'obtiens cet effet en utilisant les deux vues les unes sur les autres (en comblant le vide dans la vue en forme de V), mais ce n'est pas optimal parce que je dois savoir exactement quelle est l'autre vue la vue de dessus est plus grande que la source.

Merci

Répondre

0

Dans Android, cela se fait à l'aide Porter-Duff transfert Modes.

Votre meilleur pour cela est d'avoir deux bitmaps superposés: Un qui a la forme d'un V rouge, et un bitmap complémentaire qui représente tout ce que vous voulez couper de la couche inférieure.

Avec une vue personnalisée, vous substituez onDraw() faire comme suit:

  • ôtez la base (bleu) bitmap
  • Dessiner la bande rouge en utilisant le mode Porter-Duff SRC_OVER
  • Dessiner le haut V découpe en utilisant le mode Porter-Duff CLEAR

Le code ressemblerait à ceci (en supposant que vous avez créé les bitmaps et calculé les coordonnées x, y où vous voulez les dessiner):

Paint paint = new Paint(); 
    paint.setAntiAlias(true); 

    canvas.drawBitmap(blue_base, blueX, blueY, paint); 

    // draw the red v on top of the blue part 
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)); 
    canvas.drawBitmap(red_v, redX, redY, paint); 

    // erase the unwanted pixels from the blue part 
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
    canvas.drawBitmap(cut_out, redX, redY, paint); 

Voici un tutoriel intéressant pour vous lancer: Punch a hole in a bitmap by using Android's porter-duff Xfer - TechRepublic