Второй слой наложений на виде карты - PullRequest
0 голосов
/ 29 ноября 2011

У меня есть Android MapView, в котором мне нужно иметь второй слой наложенных пинов, поверх того, который MapView уже обрабатывает.

Для этого я поместил FrameLayout поверх MapView и поместилмои булавки как ImageViews в этом макете.

Я переопределил метод Draw () в ImageViews, чтобы обновить их положение, когда карта перемещается (так, чтобы булавки перемещались вместе с ней) следующим образом:

public void draw(Canvas canvas) {
    if(mCoordinates != null && mapView != null){
        LayoutParams mParams = (LayoutParams)this.getLayoutParams();
        mapView.getProjection().toPixels(mCoordinates, newPosition);
        mParams.leftMargin = newPosition.x;
        mParams.topMargin = newPosition.y;
    }
    super.draw(canvas);
}

Проблема: представления обновляются слишком медленно, поэтому, когда я перемещаю карту, булавки, кажется, отстают от нее.

Любое понимание подхода или реализации приветствуется

Ответы [ 2 ]

0 голосов
/ 30 марта 2012

В конце мы просто помешались на методе, который бы каждый раз упорядочивал оверлеи так, чтобы большие оверлеи всегда рисовались первыми, а маленькие поверх них.

0 голосов
/ 29 ноября 2011

У меня есть приложение, которое использует несколько оверлеев для выполнения этой работы. Каждый оверлей обрабатывается по мере необходимости. В конце обработки функция (и) вызывает процедуру обновления карты. Вот скелет процедуры обновления.

    private void updateMap() {
    GeoPoint geoPoint;
    overlayList = mapView.getOverlays();
    overlayList.clear();
    locationOverlay = new MapOverlay();
    pushpinOverlay = new MapOverlay();
    arrowOverlay = new ArrowOverlay();
    tapOverlay = new TapOverlay();
    if (hasCurrentPosition) {
        locationOverlay.setDrawId(R.drawable.man);
        geoPoint = new GeoPoint(currentLatitudeE6, currentLongitudeE6);
        locationOverlay.setPointToDraw(geoPoint);
        if (isFirstFix) {
            mapController.animateTo(geoPoint);
            isFirstFix = false;
        }
    }
    if (hasPushpinPosition) {
        pushpinOverlay.setDrawId(R.drawable.locationmarker);
        geoPoint = new GeoPoint(pushpinLatitudeE6, pushpinLongitudeE6);
        pushpinOverlay.setPointToDraw(geoPoint);
    }
    calcDistance();
    if (findFlag) {
        calcArrowRotation();
    }
    setStatusMessage();
    overlayList.add(locationOverlay);
    overlayList.add(pushpinOverlay);
    if (findFlag) {
        overlayList.add(arrowOverlay);
    }
    overlayList.add(tapOverlay);
    mapView.invalidate();
}

Наложение касаний является «верхним» наложением и должно добавляться последним. Изображения jpushpin и местоположения «заблокированы» на карте, потому что они указаны как lat и long. Перекрытие касания возвращает точку карты, которая была нажата, а не точку экрана. Стрелка расположена на экране и вращается, а не движется горизонтально или вертикально. Кроме того, наложение стрелок включается и выключается пользователем (findFlag - это логическое значение, переключаемое кнопкой).

Может быть, вы можете использовать вариант этой темы с подробным наложением в качестве одного из наложенных слоев?

...