Guest Post: Continuum, cos’è e come sfruttarlo al meglio
Questo post è stato scritto da Alessio Iafrate, leader della community DotNet Abruzzo
Continuum è una delle tecnologie più interessanti integrate nell’ultima incarnazione del sistema operativo Windows, naturalmente stiamo parlando di Windows 10.
Anche se con lo stesso nome, la tecnologia è presente con funzionalità differenti nella variante Destop/Tablet e Mobile del sistema
Iniziamo a vedere il funzionamento di Continuum sui sistemi Desktop/Tablet, visto che ci riguarda in modo minore come sviluppatori.
Sul versante Desktop la tecnologia Continuum permette di adattare l’interfaccia del sistema operativo in automatico ed in tempo reale in base alle caratteristiche del device che si sta utilizzando abilitando quella che viene definita modalità tablet (può essere anche forzata dall’action center). Questa modalità modifica sia alcuni elementi dell’interfaccia grafica, come la posizione del tasto back, la UI dei menù contestuali o la dimensione della schermata start, sia alcune funzioni più integrate nel sistema, come la gestione delle finestre che in caso di modalità tablet vengono aperte sempre a pieno schermo per permettere una gestione sempre ottimale del sistema.
Un esempio su tutti dell’utilizzo di questa modalità è quello del Surface con il quale semplicemente inserendo o estraendo la tastiera si passa da una modalità all’altra
Non ci soffermeremo su questa versione di Continuum in quanto si riflette esclusivamente sulla necessità di realizzare la nostra applicazione con un layout adattivo (pratica da seguire sempre e comunque)
Caso più interessante e quello della variante Mobile di Continuum.
Sui terminali Windows 10 Mobile infatti Continuum permette (nei telefoni compatibili) di gestire un secondo schermo in maniera indipendente dal telefono.
Questo vuol dire avere a disposizione un secondo dispositivo che, sfruttando le potenzialità della UWP, permette di utilizzare le nostre app come se girassero su un PC vero e proprio mentre il telefono rimane indipendente ed utilizzabile, il tutto potenziato dalla possibilità di collegare al telefono hardware come tastiere, mouse, unità di archiviazione esterne e stampanti per renderlo un PC a tutti gli effetti.
Oltre al collegamento tramite eventuali docking station, è disponibile anche la possibilità di collegarsi tramite adattatori compatibili con lo standard miracast ed anche tramite l’XBOX One aprendo di fatto ad utilizzi non solo business ma anche videoludici.
Questa funzionalità è già disponibile per tutte le app sviluppate con il framework UWP e se pensate già con un design adattivo saranno utilizzabili in maniera soddisfacente in entrambe le situazioni.
La cosa più interessante che possiamo però fare se vogliamo sfruttare al meglio Continuum è utilizzare il display del telefono come schermo secondario per visualizzare informazioni aggiuntive, proprio come ad esempio si comporta l’app di powerpoint, che visualizza la presentazione su schermo esterno e le note ed i dettagli sullo smartphone.
Per avere accesso a queste funzionalità abbiamo a disposizione la classe ProjectionManager che permette di gestire i display secondari.
La documentazione sulla classe è reperibile al seguente link
Come è possibile notare questa classe esisteva già con Windows/Windows Phone 8.1 ed era possibile utilizzarla per gestire schermi secondari come un secondo monitor oppure un proiettore.
Dopo tante spiegazioni è ora di iniziare a sporcarci le mani e vedere come integrare il tutto nelle nostre app.
Quello che dobbiamo fare innanzitutto è controllare la disponibilità di uno schermo secondario controllando la proprietà:
ProjectionManager.ProjectionDisplayAvailable
Il controllo è necessario perché nel caso in cui il secondo schermo non fosse disponibile le API non darebbero nessuna eccezione, ma aprirebbero la seconda finestra a pieno schermo mostrandola davanti alle altre con un effetto decisamente fastidioso.
Una volta che il controllo è andato a buon fine possiamo lanciare le view sui due schermi con un codice simile al seguente.
privateasyncTask ShowSecondView()
{
mainViewId = ApplicationView.GetForCurrentView().Id;
secondViewId = null;
var view = CoreApplication.CreateNewView();
await view.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
secondViewId = ApplicationView.GetForCurrentView().Id;
var rootFrame = newFrame();
rootFrame.Navigate(typeof(PhonePages), he);
Window.Current.Content = rootFrame;
Window.Current.Activate();
});
if (secondViewId.HasValue)
{
ProjectionManager.StartProjectingAsync(secondViewId.Value, mainViewId);
}
}
Andiamo ad analizzare nel dettaglio il codice.
Cuore di tutto è la chiamata al metodo:
publicstatic IAsyncAction StartProjectingAsync(
int projectionViewId,
int anchorViewId
)
al quale dobbiamo passare gli id della vista corrente e della vista che vogliamo visualizzare sul display secondario.
La nuova vista è stata creata con CoreApplication.CreateNewView e poi popolata con la pagina da visualizzare (nel nostro caso PhonePages) e quindi passata con l’id di riferimento a StartProjectingAsync.
Adesso le 2 viste girano in maniera indipendente l’una dall’altra e se abbiamo necessità di farle comunicare potremo utilizzare una semplice gestione degli eventi tra le due view.
Ulteriore accorgimento è quello di richiamare alla chiusura della finestra in questione il metodo
public static IAsyncAction StopProjectingAsync(
int projectionViewId,
int anchorViewId
)
Altrimenti ci potremmo trovare in una situazione di incongruenza tra le finestre visualizzate.
L’ultima nota non è di carattere prettamente tecnico ma di usabilità, nell’integrazione della funzionalità di Continuum bisogna tener presente che l’utente potrebbe anche non voler tenere occupati entrambi i display perché vuole utilizzarli per attività diverse, è buona norma quindi prevedere un’opzione o un messaggio di conferma per poter modificare questo comportamento, soprattutto se l’apertura delle 2 viste avviene in contemporanea.
Adesso avete a disposizione tutte le informazioni per sfruttare al massimo queste funzionalità e distinguere le vostre app dalla massa. Buon coding :D