Наложение растрового изображения на холст
Я хотел бы создать "графическую бумагу" для растрового изображения, которое я рисую через 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
, которые вы могли бы реализовать.