Пользовательский OverlayItem не рисует - PullRequest
9 голосов
/ 11 августа 2010

Я создал собственный класс OverlayItem, чтобы по сути иметь один вид OverlayItem, маркер Drawable которого мог бы устанавливать себя в зависимости от состояния некоторых данных, которые я передаю в него.

Я попытался выполнить этопри первой попытке использования метода setMarker в классе OverlayItem.Как только это не сработало, я пытаюсь переопределить метод getMarker и заставить его вернуть соответствующий маркер для представления данных.

Обе эти попытки закончились ничем не нарисованным на карте ... однако, если онизакомментированы маркеры рисуются просто отлично (за исключением того, что они, конечно, используют маркер по умолчанию, а это не то, что я хочу)и они не сработали):

private class MyOverlayItem extends OverlayItem {
    private Context mContext;
    private MyData mData;

    public MyOverlayItem(GeoPoint point, MyData data, Context context) {
        super(point, data.getWhat(), data.getWhere());
        this.mContext = context;
        this.mData = data;

        /*if(data.getTemp() > 200)
            this.setMarker(res.getDrawable(R.drawable.icon_data_hot_l));
        else if(data.getTemp() > 100)
            this.setMarker(res.getDrawable(R.drawable.icon_data_neutral_l));
        else
            this.setMarker(res.getDrawable(R.drawable.icon_data_frozen_l));*/
    }

    /*@Override
    public Drawable getMarker(int stateBitset) {
        Resources res = this.mContext.getResources();
        if(this.mData.getTemp() > 200)
            return res.getDrawable(R.drawable.icon_data_hot_l);
        else if(this.mData.getTemp() > 100)
            return res.getDrawable(R.drawable.icon_data_neutral_l);
        return res.getDrawable(R.drawable.icon_data_frozen_l);
    }*/
}

Есть ли способ сделать то, что я пытаюсь сделать ... или мне нужно создать уникальный класс OverlayItem, соответствующий каждому состоянию моих данных?(Еа.)

Ответы [ 4 ]

4 голосов
/ 11 августа 2010

Мне удалось заставить маркеры появляться, однако они появляются вверх ногами (по крайней мере, я так думаю, возможно, просто их тень находится слева вверху, а не справа внизу).

Все, что мне нужно было сделать, это добавить эту строку:

this.mMarker.setBounds(0, 0, this.mMarker.getIntrinsicWidth(), this.mMarker.getIntrinsicHeight());

... а также эта строка для правильной ориентации маркеров (я добавил это, когда мой ItemizedOverlay добавляет загар элемента наложения:

overlay.setMarker(boundCenterBottom(overlay.getMarker(0)));
2 голосов
/ 12 августа 2010

API заявляет, что для маркера требуются границы для отображения ...

@ celestialorb Любой из ваших фрагментов выполняет работу самостоятельно (или мой работал с любым из них в любом случае), когда вы используете только setBounds ()вы получаете то, что вы говорите, чтобы сделать ... ограничивающий прямоугольник для вашего маркера установлен.Ориентация к точке и слою OverlayItem маркера и т. Д. Установлена ​​по умолчанию (не просматривал их, но они не выполняют то, что я хочу ...):)

mOverlay.setMarker(boundCenterBottom (mOverlay.getMarker (0)));выполняет всю работу за вас, устанавливая границы и центрируя нижнюю часть маркера на точке (отсюда и стильное название метода).

Теперь, что касается лучших практик, лампочки ярче, чем мне придётся звонить...

1 голос
/ 08 июля 2011

Вот еще один подход:

GoogleMaps: пользовательские ItemizedOverlay и OverlayItem, правильный способ отображения другого маркера

Я думаю, что предпочитаю этот ответ, хотя ... спасибо!

1 голос
/ 11 августа 2010

Попробуйте переопределить метод onDraw() вашего класса наложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...