2015-01-06 9 views
10

Kiedy zaczynam malować, koloruje całe tło, to znaczy, że powinno tylko malować białe plamy. Zrzut ekranu aplikacji przedstawia się następująco. Korzystając z Android Paint, chcę pomalować tylko białe plamki na tle do rysowania [Panda] i pomijać dowolny inny kolor.Wykrywanie koloru tła z Androidem Paint

onDraw() funkcja:

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

i onTouchEvent funkcja:

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

Odpowiedz

6

Rzecz jesteś opisujące nazywa maskowania. Potrzebujesz maski (białe obszary) i zamaskowanego obrazu (twoje pociągnięcia). Podczas rysowania musisz użyć maski, aby przyciąć swoje pociągnięcia do kształtu maski. Można to zrobić za pomocą trybów PorterDuff. Zobacz Pseudokod:

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

zobaczyć link aby uzyskać więcej informacji: http://ssp.impulsetrain.com/porterduff.html


EDIT: Oto obraz jak to działa. Niebieskie obszary powinny być przezroczyste. Mnożenie między maską i obrysami to tak zwane maskowanie.

enter image description here

+0

Przepraszam, ale nie mam żadnej wiedzy na temat maskowania bitmap. Jaką wartość zainicjowałaby "Bitmap whiteAreas"! taki sam jest problem z 'uderzeniami bitmapowymi' –

+0

whiteAreas jest właśnie tym, co mówi nazwa - bitmapą tak wielką jak obraz pandy, z przezroczystym tłem oraz z brzuchem i twarzą pandy wyciągniętej. Mapa bitowa pociągnięć służy do przechowywania rysunków wykonanych przez użytkownika. Przygotowałem dla Ciebie obraz – Zielony

+0

Przepraszam raz jeszcze, ale nie rozumiem :(, mam na myśli, jak utworzyć maski i pociągnięcia bitmap z klasy 'view'? Tło, nad którym pracujemy, jest klasą Rozszerzony z 'widoku' . –