Xamarin.Forms.Maps.Map sa как изображение - PullRequest
0 голосов
/ 13 января 2019

Не могу найти как сохранить карту (Xamarin.Forms.Maps.Map) как изображение? Есть общий подход для iOS и Android? Есть ли возможность создать реализацию в общем проекте?

Спасибо за ответ.

1 Ответ

0 голосов
/ 16 января 2019

Я решил проблему, это рабочий код

открытый класс ScreenshotManager: IScreenshotManager { только для чтения Активность _activity;

    public ScreenshotManager(Activity activity)
    {
        _activity = activity;
    }

    public async Task<byte[]> CaptureMapAsync(Map map)
    {
        if (_activity == null)
        {
            throw new Exception("You have to set ScreenshotManager.Activity in your Android project");
        }

        var renderer = Platform.GetRenderer(map);
        Platform.SetRenderer(map, renderer);

        var viewRenderer = renderer.View;
        var mapRenderer = (MapRenderer)viewRenderer;
        var mapView = mapRenderer.Control;

        var mapDownloaderTask = new TaskCompletionSource<byte[]>();
        mapView.GetMapAsync(new OnMapReadyCallback(m =>
        {
            mapDownloaderTask.SetResult(m);
        }));

        return await mapDownloaderTask.Task;
    }
}

internal class OnMapReadyCallback : Java.Lang.Object, IOnMapReadyCallback
{
    readonly Action<byte[]> handler;

    public OnMapReadyCallback(Action<byte[]> handler)
    {
        this.handler = handler;
    }

    void IOnMapReadyCallback.OnMapReady(GoogleMap googleMap)
    {
        googleMap.Snapshot(new SnapshotMapCallBack(handler));
    }
}

internal class SnapshotMapCallBack : Java.Lang.Object, GoogleMap.ISnapshotReadyCallback
{
    readonly Action<byte[]> handler;

    public SnapshotMapCallBack(Action<byte[]> handler)
    {
        this.handler = handler;
    }

    public void OnSnapshotReady(Bitmap snapshot)
    {
        using (var stream = new MemoryStream())
        {
            snapshot.Compress(Bitmap.CompressFormat.Png, 0, stream);
            byte[] bitmapData = stream.ToArray();
            handler?.Invoke(bitmapData);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...