從 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.Rotation0
、SurfaceOrientation.Rotation90
、SurfaceOrientation.Rotation180
、SurfaceOrientation.Rotation270
。
傳回
List<Rect>
周框 Rect
的清單 (每個顯示遮罩區域各一個)。
GetBounds
public Region GetBounds()
傳回遮罩的周框區域。
遮罩可能會有一個以上,在這種情況下,傳回的 Region
將不會是連續的,而且如果周框矩形不會先有交集,則不具任何意義。
傳回
Region
遮罩的周框區域。 座標會位於內容檢視的左上角,並且以像素為單位。