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

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

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

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

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

    холст = mSurfaceHolder.lockCanvas (ноль); BitmapDrawable TileMe = новый 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, ноль);

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

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

Есть идеи, как этого добиться?


person Paul Mennega    schedule 29.01.2011    source источник


Ответы (2)


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

  • Либо используйте BitmapDrawable, но вместо извлечения Bitmap просто вызовите BitmapDrawable.draw (Canvas). Не забудьте установить границы рисования, чтобы заполнить область рисования.
  • Создайте Paint с BitmapShader и нарисуйте им прямоугольник (это в основном то, что делает BitmapDrawable).
person Romain Guy    schedule 29.01.2011
comment
Использовал метод BitmapDrawable.draw (Canvas), отлично работает, спасибо! - person Paul Mennega; 30.01.2011
comment
Возможно, заметив, что вам нужно установить myBitmapDrawable.setTileModeX (Shader.TileMode.REPEAT); и myBitmapDrawable.setTileModeY (Shader.TileMode.REPEAT); чтобы нарисовать его плиткой ... - person bk138; 06.09.2012

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

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

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

person user432209    schedule 29.01.2011
comment
Вы можете использовать BitmapDrawable с Canvas. Все, что вам нужно сделать, это написать theDrawable.draw (холст). - person Romain Guy; 29.01.2011