Можно ли перемещать карту на ощупь в Blackberry с помощью MapField. - PullRequest
1 голос
/ 19 декабря 2011

Я использую mapField для создания пользовательской карты. Я использую код в этой ссылке. Как показать несколько местоположений в Blackberry MapField? . Но положение карты фиксировано. я не могу перетащить карту, как мы можем сделать на картах Google или когда мы вызываем карты, такие как

 public void execute(ReadOnlyCommandMetadata metadata, Object context) 
        {
            Invoke.invokeApplication(Invoke.APP_TYPE_MAPS, new MapsArguments());
        }

1 Ответ

3 голосов
/ 19 декабря 2011

Вот некоторый код, который поможет вам выбрать правильный путь. Я взял это из моего проекта, у которого были некоторые особые требования, так что там могут быть непреднамеренные остатки этого. Там будут некоторые неопределенные переменные - это переменные-члены, которые объявлены в классе и должны начинаться с подчеркивания. Это также часть класса, который расширяет MapField, поэтому вам придется создать собственный класс карты, а затем использовать его вместо значения по умолчанию.

protected boolean touchEvent(TouchEvent message) {
    boolean ret =  super.touchEvent(message);

    //mark that we're starting to interact
    if(message.getEvent() == TouchEvent.DOWN) {
        _startTouchTracking = true;
        _clicking = true;

        _touchX = message.getX(1);
        _touchY = message.getY(1);

    }
    //user is wanting to move the map
    else if(message.getEvent() == TouchEvent.MOVE) {
        int dx = _touchX - message.getX(1);
        int dy = _touchY - message.getY(1);
        _clicking = false;
        _touchX = message.getX(1);
        _touchY = message.getY(1);

        //perform checks to make sure we don't move outside of the map's range
        int lat = getLatitude() - dy*(int)MathUtilities.pow(2, (double)getZoom());
        if(lat < -9000000) {
            lat = -9000000;
        }
        else if (lat > 9000000) {
            lat = 9000000;
        }
        int lon = getLongitude() + dx*(int)MathUtilities.pow(2, (double)getZoom());
        if(lon < -18000000) {
            lon = -18000000;
        }
        else if (lon > 18000000) {
            lon = 18000000;
        }

        moveTo(lat, lon);
    }
    //if the person just touches and releases, we want to move to that spot
    else if (message.getEvent() == TouchEvent.UNCLICK && _clicking) {
        int dx = message.getX(1) - getWidth()/2;
        int dy = message.getY(1) - getHeight()/2;
        move(dx, dy);
        _clicking = false;
    }
    //touch has been released
    else if (message.getEvent() == TouchEvent.UP) {
        _startTouchTracking = false;
    }
    //we handled the click
    return true;
}

Как уже говорилось, это может потребовать настройки для вашего использования, но в целом вы должны начать. Звонки MathUtilities.pow() были моим способом придумать соответствующее количество движения в зависимости от уровня масштабирования.

Редактировать для комментариев

Разрешение перемещения растрового изображения вместе с картой:

protected Coordinates _bitmapCoordinates;
protected Bitmap _bitmap;
public YourMapField() {
    //we're going to put the bitmap at -38.43, 20.32
    _bitmapCoordinates = new Coordinates(-38.43, 20.32, 0.0);
    _bitmap = YOUR_CODE_TO_GET_THE_BITMAP;
}

protected void paint(Graphics g) {
    super.paint(g);
    XYPoint placeToPaintBitmap = new XYPoint();
    convertWorldToField(_bitmapCoordinates, placeToPaintBitmap);

    //perform a check here to make sure that field will be seen. This code would depend
    //on how you're painting the image. Just check the placeToPaintBitmap.x and placeToPaintBitmap.y
    //against 0 and the map's width and height, along with some adjustment for how you paint
    if(bitmap will be visible on the screen) {

        //The code I have here is drawing the bitmap from the top left of the image, but if
        //you need to draw from some other place you may have to offset the x and y 
        g.drawBitmap(placeToPaintBitmap.x, placeToPaintBitmap.y, _bitmap.getWidth(), _bitmap.getHeight(), 0, 0);
    }
}

Я не тестировал этот код, поэтому он может содержать ошибки, но должен дать вам общее представление.

...