:: Enseignements :: Master :: M2 :: 2012-2013 :: Développement Android ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Interface graphique sous Android |
Exercice 1 - Un formulaire sous haute tension
On souhaite réaliser une activité de saisie de tension artérielle. Le formulaire doit proposer de saisir la date, l'heure, la tension artérielle systolique et diastolique (en valeur entière de mmHg).
- Créer une activité ainsi que le layout XML adéquat pour le formulaire proposé avec si possible un souci d'esthétisme et d'adaptabilité à tous les écrans. On essaiera d'employer les widgets les plus adaptés pour chacun des champs.
- Faire en sorte que la date et l'heure initialement affichés correspondent à l'instant présent. Rajouter un bouton à proximité afin de les réinitialiser à l'instant présent.
- Ajouter un bouton de validation affichant longtemps un popup toast avec les données entrées lorsque l'utilisateur clique.
- [Bonus] Le mmHg est une unité de pression (appelée également torr en hommage à Torricelli, l'inventeur du baromètre) équivalent à la pression exercée par 1 mm de mercure. Elle est très utilisée dans le milieu médical pour exprimer la pression artérielle. On souhaite cependant pouvoir entrer les données également en hecto-pascals (hPa) qui est une unité du système international (SI). Nous avons 1 torr = 1,333224 hPa. Ajouter un groupe de boutons radio permettant de choisir l'unité (mmHg ou hPa) et réalisant automatiquement la conversion si le choix est changé.
Exercice 2 - Un chronomètre analogique
Nous reprenons l'exercice du chronomètre du TD précédent. Nous souhaitons ici remplacer le TextView affichant le temps cumulé écoulé par un contrôle affichant une horloge analogique. Les plus paresseux remarqueront qu'un tel contrôle existe déjà (AnalogClock) mais nous désirons l'implanter nous même.
- Créer une classe MyClockView dérivant de View pour l'affichage analogique du temps. Cette classe disposera d'un setter setElapsedTime(int) pour indiquer le temps écoulé en secondes. La méthode onDraw(Canvas) devra être redéfinie pour dessiner le cadran et les aiguilles (heure, minute, seconde) sur le Canvas. Plutôt que d'implanter le code de dessin directement dans onDraw, on peut déléguer cette tâche à une nouvelle classe implantant Drawable.
- Remplacer le cadran circulaire dessiné par une image de fond, telle que celle-ci.
- Intégrer la vue créée à l'activité chronomètre.
-
Attendre d'être contacté par les chemins de fer suisses et préparer un chèque de 21M$.
- Remplacer les boutons de démarrage et d'arrêt du chronomètre par des items présents dans la barre d'action.
Exercice 3 - Un factoriseur Android
On souhaite implanter un factoriseur de nombres sous Android. L'activité créée comporte un champ permettant d'entrer le nombre à factoriser, un bouton pour lancer la factorisation ainsi qu'une barre de progression. On utilisera
un algorithme de factorisation simple consistant à tester tous les diviseurs impairs jusqu'à atteindre la racine carrée du nombre à factoriser. Nous connaissons donc une borne maximale du nombre de diviseurs restant à tester (borne atteinte si le nombre est premier) ce qui va nous permettre d'estimer une progression pessimiste. A la fin du calcul, nous affichons le résultat dans un TextView.
- Écrire le squelette de l'activité ainsi que son layout XML.
- Coder naivement l'algorithme de factorisation dans le listener rattaché à l'évènement onClick (on utilisera des long pour réaliser les calculs) du bouton de lancement de calcul. Essayer de factoriser les nombres de Mersenne 2^31-1 = 2147483647 puis 2^61-1 = 2305843009213693951 et constater le problème très gênant. Pour information ces deux nombres sont premiers (2^31-1 a été découvert par Euler à la main en 1772).
- On souhaite éviter le problème précédent : on va utiliser à cet effet un AsyncTask<Long, Long, List<Long>> . On implante la méthode List<Long> doInBackground(Long... l) pour calculer la factorisation de l[0], void onProgressUpdate(Float... progressRatio) pour mettre à jour la barre de progression de l'UI et void onPostExecute(List<Long> factors) pour afficher la factorisation dans l'UI à la fin du calcul.
- On souhaite que la thread de calcul où est exécutée doInBackground soit arrêtée lorsque l'application passe en arrière-plan (si le calcul n'est pas terminé). Annuler la tâche de calcul dans onPause() par un appel à AsyncTask.cancel(true) ; ne pas oublier de vérifier régulièrement si la tâche n'a pas été annulée tous les N diviseurs testés.
Exercice 4 - Un petit lecteur de flux de syndication Atom
Nous voulons implanter un lecteur de flux Atom ; ces flux se présentent sous la forme de fichiers XML ; ils sont téléchargés à intervalles réguliers depuis un serveur web. Par exemple, le flux Atom du blog Android Developers est disponible
ici. Le format Atom est défini par
la RFC 4287.
Exercice 5 - Barbouillage à plusieurs doigts
On souhaite créer une activité de barbouillage de l'écran où l'on autorise l'usage de plusieurs doigts.
- Créer une nouvelle activité avec un layout accueillant une unique vue occupant tout l'espace de l'écran.
- Réagir aux évènements de touché afin de dessiner des lignes suivants le mouvement de chaque doigt glissant sur l'écran. Adopter des couleurs différentes pour chacun des tracés selon l'ancienneté de l'appui (le 1er doigt posé sur l'écran produit des lignes de couleur bleue, le second de couleur verte, le troisième de couleur rouge...). Il sera naturellement difficile de tester cette activité avec un émulateur ;)
- [Bonus (difficile)] Effacer l'écran lorsque la tablette est secouée (indice : utiliser l'accéléromètre avec SensorManager).
© Université de Marne-la-Vallée