從 Xamarin 的 Surface 雙核存取雙螢幕資訊

注意

Xamarin. Forms 使用者應該在 DualScreen NuGet 中查看 DualScreenInfo 和 TwoPaneView。

DuoSDK適用于以 Surface 雙核為目標的 Xamarin. Android 開發人員。 若要以 Surface 雙核其他可折迭的裝置為目標,請參閱 Jetpack 視窗管理員系結AndroidX。

轉軸感應器

HingeSensor 類別可以用來輕鬆地接聽 OnSensorChanged 事件,並取得更新的轉軸角度值。 在使用 DuoSDK 之前,先將 NuGet 新增至您的應用程式。顯示命名空間和 HingeSensor 類別。

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}");
}

IsSurfaceDuoDevice

public bool IsDeviceSurfaceDuo(Context context, string feature = "com.microsoft.device.display.displaymask")
    => context?.PackageManager?.HasSystemFeature(feature) ?? false;

IsAppSpanned

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();

顯示幕蔽

新增 DuoSDK NuGet 以在您的專案中使用這些 API。

using Microsoft.Device.Display;

方法

靜態方法

方法 描述
FromResourcesRect(Context context) 根據 config_mainBuiltInDisplayMaskRect 建立顯示遮罩。
FromResourcesRectApproximation(Context context) 根據 config_mainBuiltInDisplayMaskRectApproximation (最接近的矩形式遮罩近似值) 建立顯示遮罩。

物件方法

方法 描述
GetBoundingRects() 傳回 Rect 清單,其中每一個都是顯示器上非功能區域的周框矩形。
GetBoundingRectsForRotation(SurfaceOrientation rotation) 傳回與旋轉相關的 Rect 清單,其中每一個都是顯示器上非功能區域的周框矩形。
GetBounds() 傳回遮罩的周框區域。

範例

取得顯示遮罩的 Rect

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.Rotation0SurfaceOrientation.Rotation90SurfaceOrientation.Rotation180SurfaceOrientation.Rotation270

傳回

List<Rect>

周框 Rect 的清單 (每個顯示遮罩區域各一個)。

GetBounds

public Region GetBounds()

傳回遮罩的周框區域。

遮罩可能會有一個以上,在這種情況下,傳回的 Region 將不會是連續的,而且如果周框矩形不會先有交集,則不具任何意義。

傳回

Region

遮罩的周框區域。 座標會位於內容檢視的左上角,並且以像素為單位。