Menu

A

|

A

SDK Surface 2 : Touch & Code

SDK Surface 2 : Touch & Code

Je vais présenter dans cet article les premiers éléments de la programmation tactile à travers WPF 4 (dit WPF Touch) et le SDK Microsoft® Surface® 2.0. Pour bien comprendre ce qui va suivre, je vous conseille la lecture de mon dernier article sur les notions élémentaires pour la programmation tactile.

Pour commencer, parlons des événements de base de programmation tactile, à savoir : juste toucher l’écran et démarrer une action suite à cette interaction. Cette partie est gérée par WPF 4 à travers un certain nombre d’événements (tous ces événements existent en version « Preview »). Ils sont disponibles sur l’ensemble des objets qui héritent de « UIElement » et on comme scope l’objet lui-même, ce sera important pour les derniers événements que je vais présenter.

Voici la liste de ces événements :

TouchDown :

Correspond au moment ou un contact s’initie sur le périphérique, en clair : on pose le doigt.

<Grid TouchDown="Grid_TouchDown">
</Grid>
private void Grid_TouchDown(object sender, TouchEventArgs e)
{
    // Code de l’évènement
}

TouchMove :

Correspond au déplacement du contact sur le périphérique, donc quand le doigt (toujours en contact avec le périphérique) bouge sur celui-ci, c’est cet évènement qui va tracer les informations du contact (position, orientation dans le cadre de Microsoft Surface 2.0) tout au long de sa vie.

<Grid TouchMove="Grid_TouchMove">
</Grid>
private void Grid_TouchMove(object sender, TouchEventArgs e)
{
    // Code de l’évènement
}

TouchUp :

Correspond à la fin du contact et informe donc qu’il n’existe plus sur le périphérique. C’est donc quand on lève le doigt du périphérique.

<Grid TouchUp="Grid_TouchUp">
</Grid>
private void Grid_TouchUp(object sender, TouchEventArgs e)
{
    // Code de l’évènement
}

TouchEnter :

Cet événement correspond au moment ou un contact entre dans la zone de rendu d’un objet, si le contact a été initié en dehors ou est sorti de la zone pour entrer à nouveau, c’est ce qui sera déclenché.

<Grid TouchEnter="Grid_TouchEnter">
</Grid>
private void Grid_TouchEnter(object sender, TouchEventArgs e)
{
    // Code de l’évènement
}

TouchLeave :

Ce dernier événement fait l’inverse du « TouchEnter » à savoir qu’il informe de la sortie du contact de la zone de rendu du contrôle.

<Grid TouchLeave="Grid_TouchLeave">
</Grid>
private void Grid_TouchLeave(object sender, TouchEventArgs e)
{
    // Code de l’évènement
}

Ces événements sont identiques à ceux de la souris, on peut donc les assimiler à la gestion de celle-ci lorsque l’on clic, le clic correspondant au « TouchDown ».

Tous ces événements génèrent dans leurs « Callback » un délégué avec comme argument une instance de la classe « TouchEventArgs » qui représente les informations du contact. Cet argument est particulièrement intéressant, car il va nous permettre de détecter les capacités de notre périphérique.

C’est là que notre SDK Microsoft Surface 2.0 va nous être utile. Il va étendre via des méthodes d’extensions les informations liées aux événements « Touch » de WPF 4. Pour cela, un peu comme pour les extensions « Linq » nous devons ajouter à notre classe la référence de l’assembly « Microsoft.Surface.Presentation.Input » ce qui va permettre d’étendre l’une des propriétés de « TouchEventArgs » à savoir le « TouchDevice ».

Le « TouchDevice » représente toutes les informations relatives au contact qui c’est produit sur le périphérique. Il va donc nous permettre de récupérer des informations diverses sur notre contact.

Article01Article02Article03

Quand on développe une interface tactile et que l’on ne connaît pas précisément le périphérique qui va exécuter l’application, on peut faire appel à la classe « InteractiveSurface.PrimarySurfaceDevice » qui permet de tester les capacités de celui-ci. Exemple de propriétés très utiles :

IsFingerRecognitionSupported :

Permet de savoir si le périphérique est capable d’identifier la différence entre un doigt posé sur celle-ci ou un objet quelconque. La table Microsoft Surface 2.0 par exemple en est capable, mais si d’autres périphériques peuvent le faire, ils peuvent le signaler par cette fonction.

IsTagRecognitionSupported :

Permet de savoir si le périphérique à la possibilité de reconnaitre des « Tags » (comme Microsoft Surface 2.0), le périphérique peut l’indiquer par cette fonction.

IsTiltSupported :

Permet de savoir si le périphérique est inclinable (comme Microsoft Surface 2.0).

IsTouchOrientationSupported :

Permet de savoir si le périphérique peut tracer l’orientation d’un contact sur celui-ci (comme Microsoft Surface 2.0), à savoir l’angle qu’il forme avec le point zéro de la zone tactile.

IsTouchBoundsSupported :

Permet de savoir si le périphérique peut connaitre la surface de contact (comme Microsoft Surface 2.0), c’est-à-dire la forme et l’aire de ce qui touche le périphérique.

Article04

Si le périphérique supporte certaines de ces capacités, il est donc possible de faire appel à des fonctions d’extension du « TouchDevice » pour avoir cette information sur le contact en cours.

GetIsFingerRecognized() :

Permet de savoir si le contact est un doigt ou non.

GetIsTagRecognized() :

Permet de savoir si le contact est un « Tag ».

GetTagData() :

Permet de récupérer la valeur du « Tag » posé sur le périphérique.

Juste avec ces fonctions on est donc capable d’adapter notre interface tactile et de prendre en compte des informations complémentaires. Il devient alors facile d’extraire les informations du contact et de les traiter.

private void Grid_TouchDown(object sender, TouchEventArgs e)
{
    if ( InteractiveSurface.PrimarySurfaceDevice.IsFingerRecognitionSupported && e.TouchDevice.GetIsFingerRecognized() )
    {
        // Détection d'un doigt
        // On effectue les traitements liés au doigt
    }

    if ( InteractiveSurface.PrimarySurfaceDevice.IsTagRecognitionSupported && e.TouchDevice.GetIsTagRecognized() )
    {
        // Récupération de la valeur

        var tagValue = e.TouchDevice.GetTagData();

        // Détection d'un tag
        // On effectue les traitements liés au tag
    }
}

Ensuite il y a les actions communes que l’on peut faire avec un contact, comme récupérer sa position :

// On récupère la position par
// rapport à un élement graphique
// mettre NULL pour récupérer la
// position par rapport au device

Point p = e.TouchDevice.GetPosition(this);

Avec ces primitives de base, vous êtes capable de créer des applications tactiles basiques en gérant les contacts simples. Dans un prochain billet je vous montrerais comment utiliser les manipulations (dites Gestuelles) dans votre application.

SDK Surface 2 : Touch & Code

SDK Surface 2 : Touch & Code

Je vais présenter dans cet article les premiers éléments de la programmation tactile à travers WPF 4 (dit WPF Touch) et le SDK Microsoft® Surface® 2.0. Pour bien comprendre ce qui va suivre, je vous conseille la lecture de mon dernier article sur les notions élémentaires pour la programmation tactile.

Pour commencer, parlons des événements de base de programmation tactile, à savoir : juste toucher l’écran et démarrer une action suite à cette interaction. Cette partie est gérée par WPF 4 à travers un certain nombre d’événements (tous ces événements existent en version « Preview »). Ils sont disponibles sur l’ensemble des objets qui héritent de « UIElement » et on comme scope l’objet lui-même, ce sera important pour les derniers événements que je vais présenter.

Voici la liste de ces événements :

TouchDown :

Correspond au moment ou un contact s’initie sur le périphérique, en clair : on pose le doigt.

<Grid TouchDown="Grid_TouchDown">
</Grid>
private void Grid_TouchDown(object sender, TouchEventArgs e)
{
    // Code de l’évènement
}

TouchMove :

Correspond au déplacement du contact sur le périphérique, donc quand le doigt (toujours en contact avec le périphérique) bouge sur celui-ci, c’est cet évènement qui va tracer les informations du contact (position, orientation dans le cadre de Microsoft Surface 2.0) tout au long de sa vie.

<Grid TouchMove="Grid_TouchMove">
</Grid>
private void Grid_TouchMove(object sender, TouchEventArgs e)
{
    // Code de l’évènement
}

TouchUp :

Correspond à la fin du contact et informe donc qu’il n’existe plus sur le périphérique. C’est donc quand on lève le doigt du périphérique.

<Grid TouchUp="Grid_TouchUp">
</Grid>
private void Grid_TouchUp(object sender, TouchEventArgs e)
{
    // Code de l’évènement
}

TouchEnter :

Cet événement correspond au moment ou un contact entre dans la zone de rendu d’un objet, si le contact a été initié en dehors ou est sorti de la zone pour entrer à nouveau, c’est ce qui sera déclenché.

<Grid TouchEnter="Grid_TouchEnter">
</Grid>
private void Grid_TouchEnter(object sender, TouchEventArgs e)
{
    // Code de l’évènement
}

TouchLeave :

Ce dernier événement fait l’inverse du « TouchEnter » à savoir qu’il informe de la sortie du contact de la zone de rendu du contrôle.

<Grid TouchLeave="Grid_TouchLeave">
</Grid>
private void Grid_TouchLeave(object sender, TouchEventArgs e)
{
    // Code de l’évènement
}

Ces événements sont identiques à ceux de la souris, on peut donc les assimiler à la gestion de celle-ci lorsque l’on clic, le clic correspondant au « TouchDown ».

Tous ces événements génèrent dans leurs « Callback » un délégué avec comme argument une instance de la classe « TouchEventArgs » qui représente les informations du contact. Cet argument est particulièrement intéressant, car il va nous permettre de détecter les capacités de notre périphérique.

C’est là que notre SDK Microsoft Surface 2.0 va nous être utile. Il va étendre via des méthodes d’extensions les informations liées aux événements « Touch » de WPF 4. Pour cela, un peu comme pour les extensions « Linq » nous devons ajouter à notre classe la référence de l’assembly « Microsoft.Surface.Presentation.Input » ce qui va permettre d’étendre l’une des propriétés de « TouchEventArgs » à savoir le « TouchDevice ».

Le « TouchDevice » représente toutes les informations relatives au contact qui c’est produit sur le périphérique. Il va donc nous permettre de récupérer des informations diverses sur notre contact.

Article01Article02Article03

Quand on développe une interface tactile et que l’on ne connaît pas précisément le périphérique qui va exécuter l’application, on peut faire appel à la classe « InteractiveSurface.PrimarySurfaceDevice » qui permet de tester les capacités de celui-ci. Exemple de propriétés très utiles :

IsFingerRecognitionSupported :

Permet de savoir si le périphérique est capable d’identifier la différence entre un doigt posé sur celle-ci ou un objet quelconque. La table Microsoft Surface 2.0 par exemple en est capable, mais si d’autres périphériques peuvent le faire, ils peuvent le signaler par cette fonction.

IsTagRecognitionSupported :

Permet de savoir si le périphérique à la possibilité de reconnaitre des « Tags » (comme Microsoft Surface 2.0), le périphérique peut l’indiquer par cette fonction.

IsTiltSupported :

Permet de savoir si le périphérique est inclinable (comme Microsoft Surface 2.0).

IsTouchOrientationSupported :

Permet de savoir si le périphérique peut tracer l’orientation d’un contact sur celui-ci (comme Microsoft Surface 2.0), à savoir l’angle qu’il forme avec le point zéro de la zone tactile.

IsTouchBoundsSupported :

Permet de savoir si le périphérique peut connaitre la surface de contact (comme Microsoft Surface 2.0), c’est-à-dire la forme et l’aire de ce qui touche le périphérique.

Article04

Si le périphérique supporte certaines de ces capacités, il est donc possible de faire appel à des fonctions d’extension du « TouchDevice » pour avoir cette information sur le contact en cours.

GetIsFingerRecognized() :

Permet de savoir si le contact est un doigt ou non.

GetIsTagRecognized() :

Permet de savoir si le contact est un « Tag ».

GetTagData() :

Permet de récupérer la valeur du « Tag » posé sur le périphérique.

Juste avec ces fonctions on est donc capable d’adapter notre interface tactile et de prendre en compte des informations complémentaires. Il devient alors facile d’extraire les informations du contact et de les traiter.

private void Grid_TouchDown(object sender, TouchEventArgs e)
{
    if ( InteractiveSurface.PrimarySurfaceDevice.IsFingerRecognitionSupported && e.TouchDevice.GetIsFingerRecognized() )
    {
        // Détection d'un doigt
        // On effectue les traitements liés au doigt
    }

    if ( InteractiveSurface.PrimarySurfaceDevice.IsTagRecognitionSupported && e.TouchDevice.GetIsTagRecognized() )
    {
        // Récupération de la valeur

        var tagValue = e.TouchDevice.GetTagData();

        // Détection d'un tag
        // On effectue les traitements liés au tag
    }
}

Ensuite il y a les actions communes que l’on peut faire avec un contact, comme récupérer sa position :

// On récupère la position par
// rapport à un élement graphique
// mettre NULL pour récupérer la
// position par rapport au device

Point p = e.TouchDevice.GetPosition(this);

Avec ces primitives de base, vous êtes capable de créer des applications tactiles basiques en gérant les contacts simples. Dans un prochain billet je vous montrerais comment utiliser les manipulations (dites Gestuelles) dans votre application.

No Comments

Comments Are Closed