2015-01-06 23 views
10

Resim yapmaya başladığımda, tüm arka planı renklendirir, yani yalnızca beyaz lekeleri boyamalı. Uygulama ekran görüntüsü aşağıdaki gibidir. Android Paint'i kullanarak, sadece arkaplan çekilebilir [Panda] üzerinde beyaz lekeler boyamak ve diğer renkleri atlamak istiyorum.Android Paint ile arka plan görüntüsü renk tespiti

onDraw() fonksiyonudur:

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

ve onTouchEvent fonksiyonudur:

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

cevap

6

Tarif ettiğiniz şey maskeleme denir. Bir maske (beyaz alanlar) ve maskelenmiş bir görüntü (vuruşlarınız) gerekir. Çizim yaparken, maskelerinizi maskenin şeklini kesmek için maskeyi kullanmanız gerekir. PorterDuff modları kullanılarak yapılabilir. pseudocode bakınız:

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

fazla bilgi için linke bakınız: http://ssp.impulsetrain.com/porterduff.html


DÜZENLEME: Şu şekilde çalışır bir görüntü. Mavi alanlar şeffaf olmalıdır. Maske ile vuruş arasındaki çarpma, maskeleme denen şeydir.

enter image description here

+0

Üzgünüz ama Bitmap maskeleme hakkında herhangi bir bilgiye sahip değiliz. Bitmap whiteAreas'ın hangi değerle başlaması gerekir? 'Bitmap vuruşları' ile aynı sorun –

+0

whiteAreas ismin neye benzediğini gösteriyor - panda görüntüsü kadar büyük bir bitmap, şeffaf arka planlı ve göbek ve panda yüzü çizilmiş. vuruşları, bir kullanıcı tarafından yapılan çizimleri tutmak için bitmap kullanılır. Sizin için bir görüntü hazırladım – Zielony

+0

Tekrar özür dilerim, ama şu noktayı alamıyorum :(, demek istediğim, maske ve konturları "view" sınıfından bitmapler oluşturabilir miyim? Arka plan, resim yapıyoruz, bir sınıf –

İlgili konular