2017-10-12 15 views
0

Je développe une application de dessin et j'ai besoin de mettre en place un outil de gomme pour effacer les zones spéciales des images. Eraser doit effacer une partie du cercle de manière inégale. Cela signifie que seul le centre du cercle devrait être effacé complètement et les bords du cercle devraient être effacés partiellement, avec alpha.Effacer la zone de canevas avec la forme spéciale du bitmap

Pour ce comportement, j'ai créé l'image qui representes la figure de gomme à effacer

enter image description here

Ensuite, pour effacer une zone de vue, je dessine la figure de la gomme au-dessus une image comme ceci:

private val picture: Bitmap 
    private val bgPaint = Paint() 
    private var eraser: Bitmap 

    private val eraserPaint: Paint = Paint().apply { 
    val mode: PorterDuff.Mode = PorterDuff.Mode.SRC_OUT 
    xfermode = PorterDuffXfermode(mode) 
    color = Color.TRANSPARENT 
    alpha = 0 
    } 

    init { 
    val options = BitmapFactory.Options() 
    options.inMutable = true 
    picture = BitmapFactory.decodeResource(resources, R.drawable.petushara, options) 
    eraser = BitmapFactory.decodeResource(resources, R.drawable.eraser, options) 
    setLayerType(View.LAYER_TYPE_SOFTWARE, bgPaint) 
    } 

    override fun draw(canvas: Canvas) { 
    super.draw(canvas) 
    canvas.drawBitmap(picture, 0f, 0f, bgPaint) 
    canvas.drawBitmap(eraser, 100f, 300f, eraserPaint) 
    } 

Ceci est la totalité de ma classe de vue, à l'exclusion des constructeurs. Je pense que la zone de l'image sera effacée par la figure de gomme à effacer, mais il permet d'effacer par la figure de la place comme ceci:

enter image description here

Répondre

0

D'accord, je viens de trouver la solution. Écrivez le code comme ceci:

private val picture: Bitmap 
    private val bgPaint = Paint() 
    private var eraser: Bitmap 

    private val eraserPaint: Paint = Paint().apply { 
    val mode: PorterDuff.Mode = PorterDuff.Mode.XOR 
    xfermode = PorterDuffXfermode(mode) 
    } 

    init { 
    val options = BitmapFactory.Options() 
    options.inMutable = true 
    picture = BitmapFactory.decodeResource(resources, R.drawable.petushara, options) 
    eraser = BitmapFactory.decodeResource(resources, R.drawable.eraser, options) 
    setLayerType(View.LAYER_TYPE_SOFTWARE, bgPaint) 
    } 

    override fun draw(canvas: Canvas) { 
    super.draw(canvas) 
    canvas.drawBitmap(picture, 0f, 0f, bgPaint) 
    canvas.drawBitmap(eraser, 100f, 300f, eraserPaint) 
    } 

THEN résultat image ressemble à mes attentes:

enter image description here

+0

En fait, ce que je ne la meilleure solution. Si vous essayez d'effacer la zone qui a déjà été effacée, cette zone sera colorisée par la couleur d'effacement d'image. Noir dans notre cas –