Xamarin. Android から Surface Duo のデュアルスクリーン情報にアクセスする
注意
DualScreenInfo と TwoPaneView は、DualScreen NuGet でチェックアウトする必要があります。
Xamarin. DuoSDKは、Surface Duo をターゲットとする xamarin Android 開発者を対象としています。 Surface Duo と その他のたたみ込みデバイスを対象にするには、「 Xamarin. androidxで利用できる Jetpack ウィンドウマネージャーのバインド」を参照してください。
HingeSensor クラスを使用すると、OnSensorChanged イベントを簡単にリッスンし、更新されたヒンジ角度の値を取得できます。 HingeSensor 名前空間とクラスを使用する前に、アプリケーションに duosdk NuGet を追加します。
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();
これらの API をプロジェクトで使用するには、DuoSDK NuGet を追加します。
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
}
public static DisplayMask FromResourcesRect(Context context)
config_mainBuiltInDisplayMaskRect に従って、ディスプレイ マスクを作成します。
パラメーター
Context
コンテキスト
現在のアクティビティのコンテキスト。
戻り値
DisplayMask
新しいディスプレイ マスク。
public static DisplayMask FromResourcesRectApproximation(Context context)
config_mainBuiltInDisplayMaskRectApproximation に従ってディスプレイ マスクを作成します。これは、マスクの最も近い四角形ベースの近似値です。
パラメーター
Context
コンテキスト
現在のアクティビティのコンテキスト。
戻り値
DisplayMask
新しいディスプレイ マスク。
public List<Rect> GetBoundingRects()
Rect
のリストが返されます。これらはそれぞれ、ディスプレイ上の非機能領域の外接矩形です。
戻り値
List<Rect>
ディスプレイ マスク領域ごとに 1 つずつある、外接 Rect
のリスト。
public List<Rect> GetBoundingRectsForRotation(SurfaceOrientation rotation)
回転に関する Rect
のリストが返されます。これらはそれぞれ、ディスプレイ上の非機能領域の外接矩形です。
パラメーター
SurfaceOrientation
回転
回転マスクを回転させる必要があります。 指定できる値は、SurfaceOrientation.Rotation0
、SurfaceOrientation.Rotation90
、SurfaceOrientation.Rotation180
、SurfaceOrientation.Rotation270
です。
戻り値
List<Rect>
ディスプレイ マスク領域ごとに 1 つずつある、外接 Rect
のリスト。
public Region GetBounds()
マスクの境界領域が返されます。
複数のマスクが存在する場合があります。この場合、返された Region
は連続しておらず、最初に交差しなければ外接矩形は無意味になります。
戻り値
Region
マスクの境界領域。 座標は、コンテンツ ビューの左上隅を基準にピクセル単位となります。