Доступ к сдвоенным экранам в Surface Duo из Xamarin. Android
Примечание
Пользователи Xamarin. Forms должны извлекать Дуалскрининфо и Твопаневиев в Xamarin. Forms. Дуалскрин NuGet.
Xamarin. дуосдк предназначен для разработчиков Xamarin. Android, предназначенных для Surface Duo. Сведения о назначении Surface Duo и других свертываемые устройств см. в разделе Привязка диспетчера окон Jetpack, доступная в Xamarin. андроидкс. Window.
Датчик шарнира
Класс Хинжесенсор можно использовать для простого прослушивания события Онсенсорчанжед и получения обновленного значения угла шарнира. добавьте NuGet дуосдк в приложение перед использованием класса Microsoft. Device. дисплей namespace и хинжесенсор.
using Microsoft.Device.Display;
// ...
HingeSensor hingeSensor;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
hingeSensor = new HingeSensor(this);
}
protected override void OnResume()
{
base.OnResume();
if (hingeSensor?.HasHinge ?? false)
{
hingeSensor.OnSensorChanged += HingeSensor_OnSensorChanged;
hingeSensor.StartListening();
}
}
protected override void OnPause()
{
base.OnPause();
if (hingeSensor?.HasHinge ?? false)
{
hingeSensor.StopListening();
hingeSensor.OnSensorChanged -= HingeSensor_OnSensorChanged;
}
}
private void HingeSensor_OnSensorChanged(object sender, HingeSensor.HingeSensorChangedEventArgs e)
{
Console.WriteLine($"Hinge Sensor Changed: {e.HingeAngle}");
}
иссурфацедуодевице
public bool IsDeviceSurfaceDuo(Context context, string feature = "com.microsoft.device.display.displaymask")
=> context?.PackageManager?.HasSystemFeature(feature) ?? false;
исаппспаннед
Xamarin.DuoSdk содержит класс ScreenHelper
, который можно инициализировать и применить для определения того, запущено ли приложение на двух экранах:
public bool IsAppSpanned()
{
var screenHelper = new ScreenHelper();
// If initialize returns false, it's not a Duo device, can't be spanned
if (!screenHelper.Initialize(this))
return false;
return screenHelper.IsDualMode;
}
Если требуется получить границы расположения для шарнира, можно использовать метод GetHingeBoundsDip()
:
var hingeBoundsRect = screenHelper.GetHingeBoundsDip();
Маска экрана
Добавьте пакет NuGet DuoSDK, чтобы использовать эти API в своем проекте.
using Microsoft.Device.Display;
Методы
Статические методы
Метод | Описание |
---|---|
FromResourcesRect(Context context) | Создает маску экрана в соответствии с параметрами config_mainBuiltInDisplayMaskRect. |
FromResourcesRectApproximation(Context context) | Создает маску экрана в соответствии с параметрами config_mainBuiltInDisplayMaskRectApproximation, которая является ближайшим прямоугольным приближением к области маски. |
Методы объекта
Метод | Описание |
---|---|
GetBoundingRects() | Возвращает список объектов Rect, каждый из которых является ограничивающим прямоугольником для нефункциональной области на экране. |
GetBoundingRectsForRotation(SurfaceOrientation rotation) | Возвращает список объектов Rect относительно угла вращения, каждый из которых является ограничивающим прямоугольником для нефункциональной области на экране. |
GetBounds() | Возвращает ограничивающую область маски. |
Пример
Получение прямоугольника маски экрана
var displayMask = DisplayMask.FromResourcesRect(context);
var masks = displayMask.GetBoundingRectsForRotation(rotation); // pass in orientation (test with 0)
var mask = new Rect();
if(masks?.Any() ?? false) {
mask = masks.First();
// layout around masked area
}
Открытые методы
FromResourcesRect
public static DisplayMask FromResourcesRect(Context context)
Создает маску экрана в соответствии с параметрами config_mainBuiltInDisplayMaskRect.
Параметры
Context
контекст
Контекст для текущего действия.
Возвращает
DisplayMask
Новая маска экрана.
FromResourcesRectApproximation
public static DisplayMask FromResourcesRectApproximation(Context context)
Создает маску экрана в соответствии с параметрами config_mainBuiltInDisplayMaskRectApproximation, которая является ближайшим прямоугольным приближением к области маски.
Параметры
Context
контекст
Контекст для текущего действия.
Возвращает
DisplayMask
Новая маска экрана.
GetBoundingRects
public List<Rect> GetBoundingRects()
Возвращает список объектов Rect
, каждый из которых является ограничивающим прямоугольником для нефункциональной области на экране.
Возвращает
List<Rect>
Список объектов Rect
(ограничивающий прямоугольник), по одному для каждой области маски экрана.
GetBoundingRectsForRotation
public List<Rect> GetBoundingRectsForRotation(SurfaceOrientation rotation)
Возвращает список объектов Rect
относительно угла вращения, каждый из которых является ограничивающим прямоугольником для нефункциональной области на экране.
Параметры
SurfaceOrientation
поворот
Угол поворота для маски. Возможны следующие значения: SurfaceOrientation.Rotation0
, SurfaceOrientation.Rotation90
, SurfaceOrientation.Rotation180
, SurfaceOrientation.Rotation270
.
Возвращает
List<Rect>
Список объектов Rect
(ограничивающий прямоугольник), по одному для каждой области маски экрана.
GetBounds
public Region GetBounds()
Возвращает ограничивающую область маски.
Рамок может быть несколько, и тогда возвращаемый объект Region
будет несплошным, а его ограничивающий прямоугольник не будет иметь никакого смысла без нужного пересечения.
Возвращает
Region
Ограничивающая область маски. Координаты указываются относительно левого верхнего угла представления содержимого в пикселях.