Белый экран, когда я делал снимок экрана на Android с помощью Mapsui
Я использую mapsui для отображения карты IGN в моем приложении, и я хочу сделать снимок экрана карты, когда я нажимаю определенную кнопку. Поэтому я использую внедрение зависимостей, и он отлично работает в UWP. Но с Android я не могу отображать карту и у меня белый экран. Вот мой код для Android:
public Task<byte[]> TakeShot()
{
var _activity = CrossCurrentActivity.Current;
if (_activity == null)
{
throw new Exception("You have to set ScreenshotManager.Activity in your Android project");
}
var view = _activity.Activity.Window.DecorView;
view.DrawingCacheEnabled = true;
Bitmap bitmap = view.GetDrawingCache(true);
view.BuildDrawingCache();
byte[] bitmapData;
using (var stream = new MemoryStream())
{
bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream);
bitmapData = stream.ToArray();
}
return Task.FromResult(bitmapData);
}
Только карта пуста, потому что у меня есть кнопка на изображении. Спасибо за вашу помощь
1 ответ
Я использовал Mapsui
, затем я создаю функцию снимка экрана с помощью службы зависимости. Вот мой GIF, когда я делаю снимок экрана.
Вот моя услуга по получению скриншота.
[assembly: Dependency(typeof(ScreenshotService))]
namespace MVVMDataBinding.Droid
{
public class ScreenshotService : IScreenshotService
{
public byte[] Capture()
{
var _activity = CrossCurrentActivity.Current;
var rootView = _activity.Activity.Window.DecorView;
using (var screenshot = Bitmap.CreateBitmap(
rootView.Width,
rootView.Height,
Bitmap.Config.Argb8888))
{
var canvas = new Canvas(screenshot);
rootView.Draw(canvas);
using (var stream = new MemoryStream())
{
screenshot.Compress(Bitmap.CompressFormat.Png, 90, stream);
return stream.ToArray();
}
}
}
}
}
И создаем интерфейс IScreenshotService
в формах xamarin.
public interface IScreenshotService
{
byte[] Capture();
}
Используйте его в формах xamarin.
private void Button_Clicked(object sender, EventArgs e)
{
var screenshotData = DependencyService.Get<IScreenshotService>().Capture();
myImage.Source=ImageSource.FromStream(() => new
MemoryStream((byte[])screenshotData));
}
внешний код.
<ContentPage.Content>
<StackLayout>
<Grid x:Name="ContentGrid" WidthRequest="100" HeightRequest="200" />
<Button Text="Take a screen" Clicked="Button_Clicked"/>
<Image x:Name="myImage" WidthRequest="200" HeightRequest="300"/>
</StackLayout>
</ContentPage.Content>
Вот моя демонстрация.