英語で読む

次の方法で共有


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

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

マスクの表示

これらの 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
}

パブリック メソッド

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>

ディスプレイ マスク領域ごとに 1 つずつある、外接 Rect のリスト。

GetBoundingRectsForRotation

public List<Rect> GetBoundingRectsForRotation(SurfaceOrientation rotation)

回転に関する Rect のリストが返されます。これらはそれぞれ、ディスプレイ上の非機能領域の外接矩形です。

パラメーター

SurfaceOrientation回転

回転マスクを回転させる必要があります。 指定できる値は、SurfaceOrientation.Rotation0SurfaceOrientation.Rotation90SurfaceOrientation.Rotation180SurfaceOrientation.Rotation270 です。

戻り値

List<Rect>

ディスプレイ マスク領域ごとに 1 つずつある、外接 Rect のリスト。

GetBounds

public Region GetBounds()

マスクの境界領域が返されます。

複数のマスクが存在する場合があります。この場合、返された Region は連続しておらず、最初に交差しなければ外接矩形は無意味になります。

戻り値

Region

マスクの境界領域。 座標は、コンテンツ ビューの左上隅を基準にピクセル単位となります。