Determinare se l'app è estesaDetermine if the app is spanned

Un layout con stato esteso si verifica quando una singola app viene presentata su due schermi.A spanned layout occurs when a single app is presented across two screens. Per impostazione predefinita, se un'app non è personalizzata per questo scenario, il sistema le invierà una notifica per indicarle che ora occupa una larghezza e un'altezza dello schermo maggiori e che l'interfaccia utente verrà ridimensionata per adattarsi alle nuove dimensioni dello schermo.By default, if an app is not customized for this scenario, the system will notify the app that it now occupies a greater screen width and height and the app's UI will resize itself to fit the new screen dimensions.

Per altre informazioni, vedi Modalità di utilizzo della giunzione in Introduzione ai dispositivi a doppio schermo.For more info, see How to work with the seam in Introduction to dual-screen devices.

Usa questo codice per determinare se l'app è estesa su entrambi gli schermi.Use this code to determine whether your app is spanned across both screens.

Importante

Le API in Surface Duo SDK interagiscono con il dispositivo Surface Duo e non devono essere chiamate quando l'app è in esecuzione in altri dispositivi.APIs in the Surface Duo SDK interact with the Surface Duo device, and should not be called when your app is running on other devices. Prima di chiamare le API, verifica che l'app sia in esecuzione in un dispositivo Surface Duo.Before calling these APIs, you should check whether your app is running on a Surface Duo device. Per eseguire questa verifica, usare il frammento di codice isDeviceSurfaceDuo.Use the isDeviceSurfaceDuo code snippet to perform this check.

Questa raccolta di metodi può essere composta in modo da creare un controllo isAppSpanned:This collection of methods can be composed to create an isAppSpanned check:

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
    }
}

Usare il metodo getHinge per recuperare i limiti della posizione della maschera della cerniera.Use the getHinge method to retrieve the bounds for the location of the hinge mask.

Vedere ancheSee also