Наложение растрового изображения на холст

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

Я не могу передать исходное растровое изображение, содержащее фон справочника графа, в конструктор Canvas, так как я получаю Canvas в SurfaceView через вызов .lockCanvas().

Некоторые решения, которые я пробовал:

  • Я попытался реализовать это решение в моем SurfaceView Thread.run(), но проблема, на мой взгляд, заключается в том, что BitmapDrawable преобразуется в Bitmap... он теряет свойства плитки.

    canvas = mSurfaceHolder.lockCanvas(null); BitmapDrawable TileMe = new BitmapDrawable (BitmapFactory.decodeResource(getResources(), R.drawable.editor_graph)); TileMe.setTileModeX(Shader.TileMode.REPEAT); TileMe.setTileModeY(Shader.TileMode.REPEAT);

    Растровое изображение b = TileMe.getBitmap(); canvas.drawBitmap(b, 0, 0, null);

  • Если я использую метод Canvas.drawBitmap, который принимает целевой RectF в качестве параметра, похоже, что растровое изображение будет чтобы заполнить RectF... но как я могу объявить RectF надежно, что заполняет всю область просмотра?

  • Настройка фона "Деятельность" на нужный графический документ также не работает, так как макет растрового изображения/холста непрозрачен и блокирует видимость.

Любые идеи, как достичь этого?

Ответ 1

У вас есть два простых решения:

  • Либо используйте BitmapDrawable, но вместо того, чтобы извлекать Bitmap, просто вызовите BitmapDrawable.draw(Canvas). Не забудьте установить допустимые границы, чтобы заполнить область рисования.
  • Создайте Paint с помощью BitmapShader и нарисуйте с ним прямоугольник (это в основном то, что делает BitmapDrawable).

Ответ 2

Я уверен, что есть способ получить черепичный эффект с помощью SurfaceView. К сожалению, похоже, вы не можете использовать BitmapDrawable с холстом. Таким образом, вам, вероятно, придется реализовать свой собственный метод разбивки, создав собственную серию Rect на Canvas и нарисуя масштабированный растровый рисунок для каждого из них.

Честно говоря, это не так сложно. Просто получите ширину/высоту представления и создайте массив Rect на основе этих данных, чтобы вы нарисовали Bitmap to.

В качестве альтернативы, если вам не нужно вносить изменения в фактический узорный фон "на лету", просто нарисуйте его как фон и нарисуйте SurfaceView поверх него. Это сообщение, которое вы связали, предоставило несколько решений для tiling BitmapDrawable, которые вы могли бы реализовать.