Mise à jour et nouveau rendu des objets sur une carte

Il est nécessaire de souvent mettre à jour les informations concernant tout objet mappable et son nouveau rendu sur une carte. Par exemple, le nom, la description ou les coordonnées d'un objet MapLocation peuvent changer, ou bien vous pouvez vouloir modifier l'aspect d'un élément sur une carte en réponse à une action de l'utilisateur de terminal BlackBerry. Vous pouvez également vouloir afficher la position d'un contact BlackBerry Messenger de l'utilisateur et mettre à jour la carte à chaque changement de position. Lors de la création d'une classe déployant l'interface DynamicMappable, vous pouvez créer des objets mappables mis à jour dynamiquement sur une carte lorsqu'ils sont modifiés. Outre la classe DynamicMappable, le progiciel net.rim.device.api.lbs.maps.model contient l'ensemble de classes suivant, vous permettant de créer des objets mappables dynamiques.

Classe ou interface

Description

DynamicMappable

Lors de la mise en œuvre de cette interface sur une classe que vous créez, vous pouvez créer des objets mappables avec des propriétés modifiables, avec possibilité de mise à jour dynamique sur une carte.

MappableEventManager

Lorsque vous créez une classe déployant DynamicMappable, elle doit mettre en œuvre la méthode getMappableEventManager, qui renvoie un objet de cette classe. Cette classe gère les événements et les écouteurs des objets mappables dynamiques et procède aux mises à jour sur les cartes.

MappableEventListener

Vous pouvez utiliser cette interface pour écouter les modifications d'un objet mappable dynamique.

MappableChangeEvent

Lorsque vous voulez transférer des mises à jour à une carte, vous pouvez créer une instance de cette classe qui capture le contenu d'un événement de modification avec un objet mappable dynamique.

Pour créer un objet mappable dynamique, vous devez créer une classe déployant l'interface DynamicMappable. Cette classe stocke l'ancien et le nouvel état de toutes les informations modifiables. Par exemple, si votre application affiche les prix de l'essence dans diverses stations-services, votre classe mappable dynamique stocke l'ancien et le nouveau prix de l'essence.

Votre classe mappable dynamique doit déployer la méthode getEventManager. Lorsque vous appelez getEventManager depuis votre application principale, la méthode renvoie un objet MappableEventManager. Après que vous avez ajouté un objet mappable dynamique à une carte, l'objet MappableEventManager est le composant qui notifie la carte en cas de modification, forçant la carte à procéder au nouveau rendu de l'objet. Pour établir la mise à jour, vous devez créer et déclencher un objet MappableChangeEvent qui intègre l'ancien et le nouvel état du contenu modifié.

Création d'une classe déployant DynamicMappable

L'échantillon de code suivant montre comment créer une classe pouvant mettre à jour la position d'un objet sur une carte. La classe est appelée UpdatableMappable, elle développe la classe MapLocation et met en œuvre l'objet DynamicMappable. Dans le constructeur UpdatableMappable, super() est appelé pour initialiser l'objet de la même façon qu'un objet MapLocation est initialisé. La propriété MappableEventManager nécessaire à la mise en œuvre de l'interface DynamicMappable est initialisée. C'est cette instance de l'objet MappableEventManager qui active la classe UpdatableMappable pour transférer ses mises à jour à la carte à laquelle vous l'ajoutez.

Cette classe remplace également setLon() et setLat(). Lorsque vous appelez l'une de ces méthodes depuis votre application, la méthode relève la latitude ou la longitude actuelle et la stocke en tant qu'ancienne valeur avant que la classe n'appelle super pour définir la nouvelle valeur.

public class UpdatableMappable extends MapLocation implements DynamicMappable 
{    
    public MappableEventManager eventManager; 
    public double oldLat;
    public double oldLon;
    public UpdatableMappable(double lat, double lon, String name, String description) 
    {
        super(lat, lon, name, description);
        eventManager = new MappableEventManager();
    }
    public void setLon(final double lon) 
    {
        oldLon = getLon();
        super.setLon(lon);
    }
    public void setLat(final double lat) 
    {
        oldLat = getLat();
        super.setLat(lat);
    }
    public MappableEventManager getEventManager() 
    {
        return eventManager;
    }
}

Ajout d'un objet mappable dynamique à une carte

L'échantillon de code suivant montre comment créer un objet RichMapField et ajouter un objet mappable dynamique au modèle de données de la carte.

RichMapField map = MapFactory.getInstance().generateRichMapField();
map.getMapField().getAction().setCenter(new MapPoint( 45.0, -75.0));
add(map);
UpdatableMappable mappableObject = new UpdatableMappable(45.0, -75.0, 
        "Map Location", "Dynamic Updates"); 
MapDataModel model = map.getModel();
model.add(mappableObject, "dynamic", true);

Mise à jour de l'objet mappable dynamique

L'échantillon de code suivant montre comment définir de nouvelles valeurs pour la latitude et la longitude de l'objet mappable dynamique et comment initier une mise à jour du rendu de l'objet sur une carte. Vous pouvez définir les nouvelles valeurs de la latitude et de la longitude en appelant UpdatableMappable.setLat() et UpdatableMappable.setLon(). Pour transférer les mises à jour à la carte, vous pouvez appeler UpdatableMappable.getEventManager() et déclencher un objet MappableChangeEvent qui contient le nouvel et l'ancien état de l'objet.

Dans cet exemple, l'ancien état est représenté par un objet MapPoint qui contient les anciennes coordonnées. Le nouvel état est une référence à l'objet mappable mis à jour. Dans le cas où les objets mappables dynamiques sont fréquemment mis à jour avec les nouvelles informations (par exemple lorsque vous suivez une position en temps quasi réel), un objet mappable dynamique peut être écrasé avec les nouvelles valeurs avant que le gestionnaire d'événement ne puisse déclencher un événement. Dans ces cas, vous souhaiterez peut-être créer et envoyer une copie de l'objet pour vous assurer que toutes les mises à jour sont reportées sur la carte.

Les variables newLat et newLon représentent les nouvelles coordonnées de l'objet mappable dynamique, obtenu par une opération distincte, par exemple, une requête envoyée, concernant la position d'un utilisateur ou un service Web qui transfère des informations d'emplacement.

mappableObject.setLat(newLat);
mappableObject.setLon(newLon);
MappableChangeEvent event = new MappableChangeEvent();
event.setOldState(new MapPoint(mappableObject.oldLat, mappableObject.oldLon));
event.setNewState(mappableObject);
mappableObject.getEventManager().triggerEvent(event);

Ces informations vous ont-elles été utiles ? Envoyez-nous vos commentaires.