2015-01-06 3 views
10

Когда я начинаю рисовать, он окрашивает весь фон, я имею в виду, что он должен рисовать только белые пятна. Скриншот приложения выглядит следующим образом. Используя Android Paint, я хочу нарисовать только белые пятна на выделенном фоне [Panda] и пропустить любой другой цвет.Обнаружение фонового изображения с помощью Android Paint

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

и onTouchEvent функция:

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

ответ

6

Вещи вы описываете называется маскировкой. Вам нужна маска (белые области) и замаскированное изображение (ваши штрихи). При рисовании вы должны использовать маску, чтобы сократить ваши штрихи до формы маски. Это можно сделать с помощью режимов PorterDuff. Смотрите псевдокод:

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

Смотрите ссылку для получения дополнительной информации: http://ssp.impulsetrain.com/porterduff.html


EDIT: Вот изображение, как это работает. Синие области должны быть прозрачными. Умножение между маской и штрихами называется так называемой маскировкой.

enter image description here

+0

Извините, но я не имею никакого знания о растровом маскирования. Какое значение будет инициализировано «Bitmap whiteAreas»! такая же проблема с «Растровыми штрихами» –

+0

whiteAreas - это то, что говорит название - растровое изображение размером с изображение панды, с прозрачным фоном и с животом и лицом нарисованной панды. штрихи bitmap используется для хранения чертежей, сделанных пользователем. Я подготовил для вас изображение – Zielony

+0

Извините, но я не понимаю :(, я имею в виду, как бы я создал маску и ударил растровые изображения из класса 'view'? Фон, который мы рисуем, является классом расширенный от 'view'. –

Смежные вопросы