Алгоритм заливки при просмотре векторных изображений - PullRequest
0 голосов
/ 19 мая 2018

Я хочу создать подобное приложение.

Алгоритм заливки

Я применил этот код, и он отлично работает с файлами JPG или PNG.Но я хочу использовать этот алгоритм с векторным отображаемым изображением

Векторное рисованное изображение с изображением до заливки enter image description here

После заливки заливкой векторного изображения enter image description here

Ожидаемый результат должен быть таким (Заполнение флудом отлично работает, когда я устанавливаю файл JPG или PNG) enter image description here

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_flood_fill);

    iv_FloodFillActivity_image = findViewById(R.id.iv_FloodFillActivity_image);
    iv_FloodFillActivity_image.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                floodColor(event.getX(), event.getY());
            }
            return true;
        }
    });
}

private void floodColor(float x, float y) {
    final Point p1 = new Point();
    p1.x = (int) x;// X and y are co - ordinates when user clicks on the screen
    p1.y = (int) y;

    Bitmap bitmap = getBitmapFromVectorDrawable(iv_FloodFillActivity_image.getDrawable());
    //bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);

    int pixel = bitmap.getPixel((int) x, (int) y);
    int[] sourceColorRGB = new int[]{
            Color.red(pixel),
            Color.green(pixel),
            Color.blue(pixel)
    };

    final int targetColor = Color.parseColor("#FF2200");

    QueueLinearFloodFiller queueLinearFloodFiller = new QueueLinearFloodFiller(bitmap, sourceColor, targetColor);

    int toleranceHex = Color.parseColor("#545454");
    int[] toleranceRGB = new int[]{
            Color.red(toleranceHex),
            Color.green(toleranceHex),
            Color.blue(toleranceHex)
    };
    queueLinearFloodFiller.setTolerance(toleranceRGB);
    queueLinearFloodFiller.setFillColor(targetColor);
    queueLinearFloodFiller.setTargetColor(sourceColorRGB);
    queueLinearFloodFiller.floodFill(p1.x, p1.y);

    bitmap = queueLinearFloodFiller.getImage();
    iv_FloodFillActivity_image.setImageBitmap(bitmap);
}

private Bitmap getBitmapFromVectorDrawable(Drawable drawable) {
    try {
        Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
        drawable.draw(canvas);
        return bitmap;
    } catch (OutOfMemoryError e) {
        return null;
    }
}

Проверка класса: QueueLinearFloodFiller

Как использовать векторное рисование?

...