지도상에서 객체 업데이트 및 다시 렌더링하기

표시 가능한 객체의 정보를 업데이트하고 이 객체를 지도에서 다시 렌더링해야 하는 경우가 자주 있습니다. 예를 들어, MapLocation 객체의 이름, 설명 또는 좌표가 변경될 수도 있고, BlackBerry 단말기 사용자의 작업에 따라 지도에서 항목의 모양이 변경되도록 하려는 경우도 있습니다. 또는 사용자의 BlackBerry Messenger 대화 상대의 위치를 표시하고 위치 변경에 따라 지도를 업데이트하고자 할 수도 있습니다. DynamicMappable 인터페이스를 구현하는 클래스를 만들면 객체가 변경될 때마다 지도에서 동적으로 업데이트되도록 표시 가능한 객체를 만들 수 있습니다. DynamicMappable 클래스 외에도, net.rim.device.api.lbs.maps.model 패키지에는 동적으로 표시 가능한 객체를 만들 수 있는 다음과 같은 클래스 집합이 포함되어 있습니다.

클래스 또는 인터페이스

설명

DynamicMappable

만드는 클래스에 이 인터페이스를 구현하면 변경 가능한 속성을 갖는 표시 가능한 객체를 만들어 지도에서 동적으로 업데이트할 수 있습니다.

MappableEventManager

DynamicMappable을 구현하는 클래스를 만들 때에는 getMappableEventManager 메소드를 구현하여 이 클래스의 객체를 반환하도록 해야 합니다. 이 클래스는 이벤트를 관리하고 동적으로 표시 가능한 객체를 수신하며 지도에 업데이트를 시작합니다.

MappableEventListener

이 인터페이스를 사용하면 동적으로 표시 가능한 객체에 대한 변경 사항을 수신할 수 있습니다.

MappableChangeEvent

업데이트를 지도에 푸시하려는 경우, 이 클래스의 인스턴스를 만들면 동적으로 표시 가능한 객체에 발생한 변경 이벤트 내용을 캡처할 수 있습니다.

동적으로 표시 가능한 객체를 만들려면 DynamicMappable 인터페이스를 구현하는 클래스를 만들어야 합니다. 이 클래스는 변경 가능한 모든 정보에 대해 이전 상태와 새 상태를 저장합니다. 예를 들어, 프로그램이 여러 주유소의 휘발유 가격을 표시하는 경우 동적으로 표시 가능한 클래스는 이전 휘발유 가격과 새 휘발유 가격을 저장합니다.

동적으로 표시 가능한 클래스는 getEventManager 메소드를 구현해야 합니다. 기본 프로그램에서 getEventManager를 호출하면 해당 메소드는 MappableEventManager 객체를 반환합니다. 동적으로 표시 가능한 객체를 지도에 추가하면 MappableEventManager 객체는 변경이 발생할 때마다 지도에 알리는 구성 요소가 되고 객체가 지도에서 다시 렌더링되도록 합니다. 이 업데이트를 시작하려면 변경되는 내용에 대한 이전 상태와 새 상태를 포함하는 MappableChangeEvent를 만들고 작동시켜야 합니다.

DynamicMappable을 구현하는 클래스 만들기

다음 코드 샘플은 지도에서 객체의 위치를 업데이트할 수 있는 클래스를 만드는 방법을 보여줍니다. 이 클래스는 UpdatableMappable이라고 하며, MapLocation 클래스를 확장하고 DynamicMappable을 구현합니다. UpdatableMappable 생성자에서 super()가 호출되어 MapLocation 객체가 초기화되는 방식과 동일한 방식으로 객체가 초기화됩니다. DynamicMappable 인터페이스를 구현하는 데 필요한 MappableEventManager 속성이 초기화됩니다. MappableEventManager의 이 인스턴스는 UpdatableMappable 클래스가 지도에 업데이트를 푸시할 수 있도록 하는 핵심 요소입니다.

또한 이 클래스는 setLon()setLat()를 재정의합니다. 프로그램에서 이 메소드 중 하나를 호출하면 해당 메소드는 기존 위도 또는 경도를 가져와 이를 이전 값으로 저장한 다음 super를 호출하여 새 값을 설정합니다.

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;
    }
}

동적으로 표시 가능한 객체를 지도에 추가하기

다음 코드 샘플은 RichMapField 객체를 만들고 동적으로 표시 가능한 객체를 지도의 데이터 모델에 추가하는 방법을 보여줍니다.

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);

동적으로 표시 가능한 객체 업데이트하기

다음 코드 샘플은 동적으로 표시 가능한 객체의 위도와 경도에 새 값을 설정하고, 지도에서 객체를 다시 렌더링하도록 업데이트를 시작하는 방법을 보여줍니다. UpdatableMappable.setLat()UpdatableMappable.setLon()을 호출하면 위도와 경도에 새 값을 설정할 수 있습니다. 지도에 업데이트를 푸시하려면 UpdatableMappable.getEventManager()를 호출하고 MappableChangeEvent를 작동시킵니다. 여기에는 객체의 새 상태와 이전 상태가 모두 들어 있습니다.

이 예에서 이전 상태는 이전 좌표를 포함하는 MapPoint로 표현됩니다. 새 상태는 업데이트된 표시 가능한 객체에 대한 참조입니다. 동적으로 표시 가능한 객체가 새 정보로 자주 업데이트되는 경우(예: 위치를 거의 실시간으로 추적하는 경우), 동적으로 표시 가능한 객체는 이벤트 관리자가 이벤트를 작동시키기 전에 새 값으로 덮어쓰어질 수 있습니다. 이 경우, 지도에서 모든 업데이트를 다시 렌더링할 수 있도록 객체의 사본을 만들고 보낼 수 있습니다.

newLatnewLon 변수는 동적으로 표시 가능한 객체의 새 좌표를 나타냅니다. 이 좌표는 별도의 작업(예: 사용자의 위치를 수신하기 위해 보내는 요청 또는 위치 정보를 푸시하는 웹 서비스)을 통해 얻어집니다.

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);
이전 주제: 지도의 동작 제어

이 정보가 도움이 되었습니까? 의견을 보내 주십시오.