アプリがスパンされているかどうかを判断する
スパン レイアウトは、単一のアプリが 2 つの画面にわたって表示される場合に発生します。 既定では、アプリがこのシナリオ用にカスタマイズされていない場合、現在、画面のより大きな幅と高さが占有されており、アプリの UI で新しい画面のディメンションに合わせて自動的にサイズが変更されることが、システムによってアプリに通知されます。
詳細については、「デュアル スクリーン デバイスの概要」の「継ぎ目を操作する方法」を参照してください。
このコードを使用して、アプリが両方の画面にまたがっているかどうかを判断します。
重要
Surface Duo SDK の API は、Surface Duo デバイスとやりとりしますが、アプリが他のデバイスで実行されているときに呼び出すことはできません。 これらの API を呼び出す前に、アプリが Surface Duo デバイスで実行されているかどうかを確認する必要があります。 この確認を行うには、isDeviceSurfaceDuo コード スニペットを使用します。
このメソッドのコレクションを作成すると、isAppSpanned
チェックを作成することができます。
fun getCurrentRotation(activity: Activity): Int {
return try {
val wm = activity.getSystemService(Context.WINDOW_SERVICE) as WindowManager
wm.defaultDisplay.rotation
} catch (e: IllegalStateException) { Surface.ROTATION_0 }
}
fun getHinge(activity: Activity): Rect? {
// Hinge's coordinates of its 4 edges in different mode
// Double Landscape Rect(0, 1350 - 1800, 1434)
// Double Portrait Rect(1350, 0 - 1434, 1800)
return if (isDeviceSurfaceDuo()) {
val displayMask = DisplayMask.fromResourcesRectApproximation(activity)
if (displayMask != null) {
val screensBounding = displayMask.getBoundingRectsForRotation(
getCurrentRotation(activity)
)
if (screensBounding.size == 0) {
Rect(0, 0, 0, 0)
} else {
screensBounding[0]
}
} else { null }
} else { null }
}
fun getWindowRect(activity: Activity): Rect {
val windowRect = Rect()
activity.windowManager.defaultDisplay.getRectSize(windowRect)
return windowRect
}
fun isAppSpanned(activity: Activity): Boolean {
val hinge = getHinge(activity)
val windowRect = getWindowRect(activity)
return if (hinge != null && windowRect.width() > 0 && windowRect.height() > 0) {
// The windowRect doesn't intersect hinge
hinge.intersect(windowRect)
} else {
false
}
}
ヒンジ マスクの位置の境界を取得する場合は、getHinge
メソッドを使用します。