2015-01-06 22 views
10

Quando inizio a dipingere, colora l'intero sfondo, cioè deve solo dipingere le macchie bianche. Lo screenshot dell'applicazione è il seguente. Utilizzando Android Paint, voglio dipingere solo macchie bianche su sfondo disegnabile [Panda] e saltare qualsiasi altro colore.Rilevamento del colore dell'immagine di sfondo con Android Paint

funzione

onDraw() è:

protected void onDraw(Canvas canvas) { 

    canvas.drawPath(path, paint); 
    canvas.drawPath(circlePath, circlePaint); 

    for (Pair<Path,Integer> path_clr : path_color_list){ 
     paint.setColor(path_clr.second); 
     canvas.drawPath(path_clr.first, paint); 
    } 

    for (Pair<Path,Integer> path_clr : circular_path_color_list){ 
     circlePaint.setColor(path_clr.second); 
     canvas.drawPath(path_clr.first, paint); 
    } 
} 

e onTouchEvent funzione è:

public boolean onTouchEvent(MotionEvent event) { 

    float pointX = event.getX(); 
    float pointY = event.getY(); 
    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     circlePath.reset(); 
     path.moveTo(pointX, pointY); 

     return true; 
    case MotionEvent.ACTION_MOVE: 
     path.lineTo(pointX, pointY); 
     circlePath.reset(); 
     circlePath.addCircle(pointX, pointY, 10, Path.Direction.CW); 

     break; 

    case MotionEvent.ACTION_UP: 
     circlePath.reset(); 

     break; 
    default: 
     return false; 
    } 

    postInvalidate(); 
    return true; 
} 

Color Activity

risposta

6

La cosa che stai descrivendo è chiamato mascheramento. Hai bisogno di una maschera (aree bianche) e un'immagine mascherata (i tuoi tratti). Quando si disegna, è necessario utilizzare la maschera per tagliare i tratti a una forma della maschera. Può essere fatto usando le modalità PorterDuff. Vedere la pseudocodice:

Bitmap panda; 
Bitmap whiteAreas; 
Bitmap strokes; 
Canvas strokesCanvas; 
Paint paint; 

private void init() { 
    strokesCanvas = new Canvas(strokes); 
    paint = new Paint(); 
} 

private void addStroke(Path stroke){ 
    paint.setXfermode(null); 
    strokesCanvas.drawPath(stroke,paint); 
    invalidate(); 
} 

@Override 
public void draw(Canvas canvas) { 
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); 
    strokesCanvas.drawBitmap(whiteAreas,0,0,paint); 
    paint.setXfermode(null); 
    canvas.drawBitmap(panda,0,0,paint); 
    canvas.drawBitmap(strokes,0,0,paint); 
} 

Vedi il link per maggiori informazioni: http://ssp.impulsetrain.com/porterduff.html


EDIT: Ecco un'immagine come funziona. Le aree blu dovrebbero essere trasparenti. La moltiplicazione tra la maschera e i tratti è ciò che viene chiamato mascheramento.

enter image description here

+0

dispiace ma io non ho alcuna conoscenza di bitmap mascheramento. Quale valore sarebbe 'Bitmap whiteAreas' essere inizializzato con! lo stesso è il problema con 'Tracce bitmap ' –

+0

whiteAreas è proprio quello che dice il nome: una bitmap grande come l'immagine panda, con lo sfondo trasparente e con la pancia e il volto del panda disegnato. bitmap tratti viene utilizzato per contenere i disegni eseguiti da un utente. Ho preparato un'immagine per te – Zielony

+0

Scusa ancora, ma non ho capito :(, voglio dire come creo maschera e tratti bitmap dalla classe 'view'? Lo sfondo, stiamo dipingendo, è una classe esteso da 'view'. –