Если вы разработчик Flutter и используете SDK Google Maps в своем приложении, вы могли столкнуться с проблемой использования пользовательских изображений, особенно при изменении их размера и обрезке; в этой статье мы увидим, как этого добиться.

Как вы, возможно, знаете, SDK Google Maps не использует собственные виджеты Flutter для отображения значков маркеров, а использует BitmapDescriptors. По сути, они могут быть построены с использованием массива пикселей, образующих изображение, но мы не можем напрямую использовать для них всю мощь пользовательского интерфейса Flutter, потому что они не являются виджетами.

Поскольку Google еще не выпустил никакого решения (март 2021 г.), нам нужно найти уловки, чтобы обойти эти ограничения.

Изменить размер

Поскольку мы не работаем с виджетами, нам нужно иметь дело с необработанными данными изображений. Надеюсь, библиотека обработки изображений Flutter уже существует, поэтому нам просто нужно применить ее в нашем случае использования.

Зависимости для добавления:

dependencies:
  image: ^2.1.19

Давайте изменим размер изображения до желаемого размера, в конце мы увидим, как преобразовать изображение в структуру данных Uint8List.

Круг

Чтобы изменить наше основное изображение, мы будем использовать холст, чтобы рисовать на нем. Используя PictureRecorder, мы можем записывать всю обработку изображения, а затем сохранять ее как UInt8List, который мы, наконец, преобразуем в BitmapDescriptor.

Это метод, который управляет созданием экземпляра Canvas и возвращает измененный BitmapDescriptor:

И метод, отвечающий за обрезку круга:

Слияние всех

Теперь, когда у нас есть все части, давайте объединим их в один многократно используемый класс. Добавлен дополнительный метод _urlTofile (imageURL) для получения изображения из URL-адреса и последующего преобразования его в объект File.

Наслаждаться!

Вы можете использовать этот класс, чтобы наконец отобразить обведенные и измененные изображения на Google Maps с помощью Flutter! Для тех, кто имеет дело с загруженными изображениями или активами изображений, используйте тот же метод и преобразуйте только исходное изображение в файл.