Affichage heure…

1°) Préparation :

Créer un nouveau projet selon la méthode décrite ici puis copier le fichier main de la première application. changer ensuite le type d’application (menu « settings« ) en « watchface« .

Le SDK Pebble fournit la possibilité de s’abonner à un service « tickhandler » qui s’actualise à chaque changement temporel. Par exemple, si vous créez une fonction tick_handler() et que vous l’enregistrez pour qu’elle soit exécutée à chaque changement de minute, vous économisez de la batterie et cela permet d’exécuter d’autres tâches pendant l’inactivité de la fonction.

L’étape suivante est de définir une fonction de mise à jour de l’affichage :

1
2
3
4
void tick_handler(struct tm *tick_time, TimeUnits units_changed)
{
    //Here we will update the watchface display
}

Comme d’habitude cette fonction doit être écrite avant son appel. Donc avant que window_load() soit définie. On enregistre dans la fonction init() cet handler en souscrivant au service TickHandler.

1
tick_timer_service_subscribe(MINUTE_UNIT, (TickHandler) tick_handler);

Spécifier MINUTE_UNIT indique un rafraichissement toutes les minutes, d’autres types sont disponibles ici https://developer.getpebble.com/2/api-reference/group___wall_time.html#ga0423d00e0eb199de523a92031b5a1107

Dans le fonction deinit() ne pas oublier de désallouer notre timer :

1
tick_timer_service_unsubscribe();

Maintenant que notre fonction est mise à jour régulièrement, nous pouvons modifier le TextLayer pour afficher l’heure. Tout d’abord, réservez un buffer de type global pour être affiché par le TextLayer. Définissez le sous les pointeurs au début du code source :

1
char buffer[] = "Sun 00:00";

Maintenant ajouter les lignes suivantes pour formater le texte :

1
2
3
4
5
6
7
8
void tick_handler(struct tm *tick_time, TimeUnits units_changed)
{
    //Format the buffer string using tick_time as the time source
    strftime(buffer, sizeof("Sun 00:00"), "%a %H:%M", tick_time);
    //Change the TextLayer text to show the new time!
    text_layer_set_text(text_layer, buffer);
}

La liste des formats d’affichage du temps est ici http://fr2.php.net/strftime here. Maintenant dès qu’une minute change le service tick appellera notre fonction qui mettra à jour l’heure.

Le code suivant placé dans window_load() met à jour l’affichage au lancement de l’application :

1
2
3
4
5
6
7
8
//Get a time structure so that the face doesn't start blank
struct tm *t;
time_t temp;
temp = time(NULL);
t = localtime(&temp);
//Manually call the tick handler when the window is loading
tick_handler(t, MINUTE_UNIT);

afin de rendre l’affichage plus attractif, nous pouvons utilisées les fonctions du text layer (found here). Par exemple voici du code de formatage à placer dans window_load() :

1
2
3
4
5
6
7
text_layer = text_layer_create(GRect(0, 53, 132, 168));
text_layer_set_background_color(text_layer, GColorClear);
text_layer_set_text_color(text_layer, GColorBlack);
text_layer_set_text_alignment(text_layer, GTextAlignmentCenter);
text_layer_set_font(text_layer, fonts_get_system_font(FONT_KEY_BITHAM_42_BOLD));
layer_add_child(window_get_root_layer(window), (Layer*) text_layer);

Maintenant le jour de la semaine et l’heure sont écrits larges et centrés.

Code main.c :

 //-- Ajout de la librairie pebble   
 #include <pebble.h>   
 //-- Déclaration des objets Fenêtre et texte    
 Window *window;   
 TextLayer *text_layer;   
 InverterLayer *inv_layer;  
 char buffer[] = "Sun 00:00";  
 void tick_handler(struct tm *tick_time, TimeUnits units_changed)  
 {//Format the buffer string using tick_time as the time source  
  strftime(buffer, sizeof("Sun 00:00"), "%a %H:%M", tick_time);  
  //Change the TextLayer text to show the new time!  
  text_layer_set_text(text_layer, buffer);  
 }  
 //-- Définition des actions à effectuer au lancement de l'application   
 void window_load(Window *window)    
 { text_layer = text_layer_create(GRect(0, 53, 132, 168));  
  text_layer_set_background_color(text_layer, GColorClear);  
  text_layer_set_text_color(text_layer, GColorBlack);  
  text_layer_set_text_alignment(text_layer, GTextAlignmentCenter);  
  text_layer_set_font(text_layer, fonts_get_system_font(FONT_KEY_BITHAM_42_BOLD));  
  layer_add_child(window_get_root_layer(window), (Layer*) text_layer);    
  //Get a time structure so that the face doesn't start blank  
  struct tm *t;  
  time_t temp;  
  temp = time(NULL);  
  t = localtime(&temp);   
  //Manually call the tick handler when the window is loading  
  tick_handler(t, MINUTE_UNIT);  
 }   
  //-- actions à la fermeture de l'application    
 void window_unload(Window *window)   
 {//We will safely destroy the Window's elements here!  
  text_layer_destroy(text_layer);  
 }   
  //-- Initialisation   
 void init()   
 {tick_timer_service_subscribe(MINUTE_UNIT, (TickHandler) tick_handler);   
  window = window_create();   
  window_set_window_handlers(window, (WindowHandlers) {   
   .load = window_load,   
   .unload = window_unload,   
  });   
  window_stack_push(window, true);   
 }   
 //-- Déinitialisation    
 void deinit()   
 {tick_timer_service_unsubscribe();    
  window_destroy(window);   
  }   
 //-- Fonction principale   
 int main(void)   
  {   
  init();   
  app_event_loop();   
  deinit();   
  }   

Affichage de plusieurs Layout textes :

Par exemple pour diviser l’écran en deux parties :
Il faut définir 2 Layouts et pour chaque Layout un rectangle texte avec coordonnées de début et hauteur largeur.
Dans l’exemple suivant on affiche dans le layout haut le jour de la semaine et dans la layout bas l’heure

 //-- Ajout de la librairie pebble   
 #include <pebble.h>   
 //-- Déclaration des objets Fenêtre et texte    
 Window *window;   
 TextLayer *text_layer_haut;   
 TextLayer *text_layer_bas;  
 InverterLayer *inv_layer;  
 char buffer_haut[] = "Sun";  
 char buffer_bas[] = "00:00";  
 void tick_handler(struct tm *tick_time, TimeUnits units_changed)  
 {//Format the buffer string using tick_time as the time source  
  strftime(buffer_haut, sizeof("Sun"), "%a", tick_time);  
  strftime(buffer_bas, sizeof("00:00"), "%H:%M", tick_time);  
  //Change the TextLayer text to show the new time!  
  text_layer_set_text(text_layer_haut, buffer_haut);  
  text_layer_set_text(text_layer_bas, buffer_bas);  
 }  
 //-- Définition des actions à effectuer au lancement de l'application   
 void window_load(Window *window)    
 { //text_layer = text_layer_create(GRect(0, 53, 132, 168));  
  //GRect means (x, y, width, height)  
  //layer_set_frame(layer, (x, y, 144 - x, 168 - y));  
  text_layer_haut = text_layer_create(GRect(0, 0, 144, 84));  
  text_layer_set_background_color(text_layer_haut, GColorClear);  
  text_layer_set_text_color(text_layer_haut, GColorBlack);  
  text_layer_set_text_alignment(text_layer_haut, GTextAlignmentCenter);  
  text_layer_set_font(text_layer_haut, fonts_get_system_font(FONT_KEY_BITHAM_42_BOLD));  
  layer_add_child(window_get_root_layer(window), (Layer*) text_layer_haut);   
  //////////////  
   text_layer_bas = text_layer_create(GRect(0, 85, 144, 168));  
  text_layer_set_background_color(text_layer_bas, GColorClear);  
  text_layer_set_text_color(text_layer_bas, GColorBlack);  
  text_layer_set_text_alignment(text_layer_bas, GTextAlignmentCenter);  
  text_layer_set_font(text_layer_bas, fonts_get_system_font(FONT_KEY_BITHAM_42_LIGHT));  
  layer_add_child(window_get_root_layer(window), (Layer*) text_layer_bas);   
  //Get a time structure so that the face doesn't start blank  
  struct tm *t;  
  time_t temp;  
  temp = time(NULL);  
  t = localtime(&temp);   
  //Manually call the tick handler when the window is loading  
  tick_handler(t, MINUTE_UNIT);  
 }   
  //-- actions à la fermeture de l'application    
 void window_unload(Window *window)   
 {//We will safely destroy the Window's elements here!  
  text_layer_destroy(text_layer_haut);  
  text_layer_destroy(text_layer_bas);  
 }   
  //-- Initialisation   
 void init()   
 {tick_timer_service_subscribe(MINUTE_UNIT, (TickHandler) tick_handler);   
  window = window_create();   
  window_set_window_handlers(window, (WindowHandlers) {   
   .load = window_load,   
   .unload = window_unload,   
  });   
  window_stack_push(window, true);   
 }   
 //-- Déinitialisation    
 void deinit()   
 {tick_timer_service_unsubscribe();    
  window_destroy(window);   
  }   
 //-- Fonction principale   
 int main(void)   
  {   
  init();   
  app_event_loop();   
  deinit();   
  }   

Et voilà

Répondre

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l'aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

Articles récents
Commentaires récents
Catégories
Archives
%d blogueurs aiment cette page :