ItemizedOverlay, кажется, рисует с "сломанной" проекцией - PullRequest
1 голос
/ 13 августа 2010

У меня странная проблема, я не знаю, как атаковать, поэтому мне интересно, не было ли у кого-то подобной проблемы раньше.

Я переопределяю метод draw (Canvas canvas, MapView mapView, boolean shadow) в подклассе ItemizedOverlay, чтобы нарисовать некоторые пути, текст и т. Д. Между элементами. Первое, что я делаю в переопределении, это вызов super.draw со всеми этими параметрами. Когда я запускаю приложение, линии, которые я рисую в своем переопределении, находятся там, где они должны быть, но фактические элементы OverlayIte, которые рисует super.draw, уже далеко. Интересно то, что когда я перемещаю карту в верхний левый угол (координаты 0,0), элементы OverlayItems становятся все ближе и ближе к месту, где я их ожидаю (на самом деле, они выглядят идеально совпадающими, когда я получаю первое пункт к точке (0,0)). Когда я перемещаю карту так, чтобы элементы OverlayItem находились дальше от точки (0,0), они линейно удаляются от своего геолокации.

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

изменить: дополнительная информация, которая может быть полезна ... мой метод рисования выглядит следующим образом:

public void draw(Canvas canvas, MapView mapView, boolean shadow) {
    super.draw(canvas, mapView, shadow);
    if (!shadow) {
        // code for drawing the lines etc.
        // on the canvas (uses mapView.getProjection()) 
    }
}

У пользовательской части оверлея нет теневого слоя (я использовал ту же логику при расширении оверлея без проблем). Теневой слой, который рисуется для OverlayItems с помощью super.draw, фактически находится на полпути между Drawable и ожидаемой геолокацией для каждого конкретного элемента.

Вот скриншоты дерева от avd, чтобы лучше проиллюстрировать происходящее. Четыре красных булавки должны быть на красной линии над ними и фактически двигаться к линии, когда я перемещаю карту в верхнем левом углу. Два пина и линия между ними нарисованы в моем пользовательском переопределении, super.draw рисует четыре тени и четыре дополнительных красных пина.

Поскольку это мой первый пост, и я не могу опубликовать более одной ссылки, я поместил все три снимка экрана в один и тот же jpg.
Скриншот

Ответы [ 2 ]

0 голосов
/ 15 августа 2010

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

Проблема заключалась в моем неправильном понимании фундаментальныхспособ рисования рисовать.Это недоразумение возникло при чтении JavaDoc для Drawable.draw, в котором говорится:

Рисование в своих границах (устанавливается через setBounds) с учетом дополнительных эффектов, таких как альфа (устанавливается через setAlpha) и цветовой фильтр (устанавливается черезsetColorFilter).

Поскольку у меня изначально был подкласс Overlay, рисующий путь, который вы можете видеть на скриншоте, и я решил использовать ItemizedOverlay для маркеров вдоль этого пути (чтобы их можно было легко переставлять и т. Д.), Я решилнемного изменить мой класс.В определенный момент, чтобы посмотреть, все ли работает так, как я ожидал, я добавил несколько элементов и использовал тот же Drawable, что и для одной из конечных точек пути.Руководствуясь JavaDoc для метода draw, я использовал что-то вроде этого для рисования конечных точек пути

private void drawMarker(Canvas canvas, Projection projection,
    GeoPoint location, Drawable drawable) {
    Point point = projection.toPixels(location, null);
    drawable.setBounds(
        point.x,
        point.y - drawable.getIntrinsicHeight(),
        point.x + drawable.getIntrinsicWidth(),
        point.y);
    drawable.draw(canvas);
}  

Однако, когда я отслеживал вызов super.draw, я заметил, что он вызвал Drawable.drawно у drawable всегда были одни и те же границы - те, которые я установил с предыдущим вызовом этого метода drawMarker.Я до сих пор не понимаю, как Drawable.draw знает, куда на самом деле поместить Drawable, но, конечно же, в тот момент поведение, описанное в этом вопросе, было довольно очевидным.Оглядываясь назад, я, вероятно, должен был понять, что boundCenter и boundCenterBottom на самом деле определяют границы Drawable (именно об этом говорит их JavaDoc), но вместо этого, я думаю, я подумал, что это просто изменило способ определения границ "в конечном итоге", когдафактическая точка, на которой вы хотите рисовать, известна.

В любом случае я добавил немного дополнительной функциональности, чтобы использовать рисованные элементы, которые я на самом деле хотел использовать для OverlayItems, и, конечно же, он работает отлично.Я все еще задаюсь вопросом, является ли то, что я делаю в drawMarker, способом, которым это должно быть сделано, но я не знаю другого способа сообщить холсту, куда поместить Drawable.

0 голосов
/ 13 августа 2010

Трудно диагностировать, не глядя на код. Я бы проверил несколько вещей:

  1. Используете ли вы проекцию MapView? Убедитесь, что вы получаете новый при каждом вызове draw ()?

  2. Удостоверились ли вы в привязанном методе для ваших Drawables? например, boundCenter() или boundCenterBottom()

...