Определение цвета фонового изображения с помощью Android Paint

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

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

Ответ 1

То, что вы описываете, называется маскировкой. Вам нужна маска (белые области) и замаскированное изображение (ваши штрихи). При рисовании вы должны использовать маску, чтобы сократить ваши штрихи до формы маски. Это можно сделать с помощью режимов 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