Поделиться через


Доступ к сдвоенным экранам в 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

Ограничивающая область маски. Координаты указываются относительно левого верхнего угла представления содержимого в пикселях.