2016-12-20 3 views
3

У меня есть штырь, который имеет стрелку. При размещении маркера наконечник на самом деле не указывает на точное расположение крана. Кажется, мои штифты позиционируются в центре. Я хочу переместить этот центр на определенное смещение.Смещение положения значков маркера

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

enter image description here

Это круговая кнопка. Обратите внимание, что у него есть стрелка в нижней части (указывающая вниз).

Теперь, позволяет поместить этот штырь на MapBox:

@Override 
public void onMapClicked(@NonNull LatLng point) 
{ 
    mPopularView.showPinSelectedPopup(false); 

    if(!mIsOnMyRecommendationMode) 
     return; 

    IconFactory iconFactory = IconFactory.getInstance(getContext()); 
    Drawable iconDrawable = ContextCompat.getDrawable(getContext(), R.drawable.ic_map_bank_blue_pin); 
    Icon icon = iconFactory.fromDrawable(iconDrawable); 

    MarkerOptions markerOption = new MarkerOptions(); 
    markerOption.setPosition(point); 
    markerOption.title("Just a I don't know where I am!"); 
    markerOption.setSnippet("Hello World! I don't know where I am!"); 
    markerOption.setIcon(icon); 

    mPopularView.getMapboxMap().addMarker(markerOption); 

    mIsOnMyRecommendationMode = false; 
} 

довольно просто, так же, как в документации. Он работает очень хорошо. Посмотрите на следующий ПОС:

enter image description here

Я надеюсь, что этот рис будет рисовать тысячи слов. Пожалуйста, не предлагайте настроить LatLang для учета смещения. Это будет неверно в моем случае использования. Это должно быть положение пикселя самой иконы. MapBox должен был учитывать это, когда они позволяли разработчикам разрабатывать свои собственные пользовательские контакты (МЫ ИДЕМ СТАТЬ СТРЕЛКАМИ НА НАШИХ ПИНЕ!).

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

enter image description here

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

Как я могу обойти это? Есть идеи?

Спасибо!

Не так элегантное решение

Просто хотел отправить это как ответ на случай, если кто-то испытывает то же самое. Моя ситуация очень экстремальна, и мне действительно нужно загрузить растровое изображение на штырь, а не какой-либо другой метод, предложенный cammace. Я использую старомодное позиционирование пикселей, чтобы получить именно то, что я хотел. К счастью, MapBox оснащен трансформирующими экранными координатами для отображения координат и наоборот.

Я тестировал это как на планшете, так и на мобильном телефоне, и это, похоже, не влияет на размер экрана. Его заостренный край теперь фактически указывает на мою назначенную цель:

LatLng position = new LatLng(); 
position.setLatitude(lat); 
position.setLongitude(long); 

PointF pointF = mMapboxMap.getProjection().toScreenLocation(position); 
pointF.offset(0f, -(icon.getBitmap().getHeight()/2.0f)); 

position = mMapboxMap.getProjection().fromScreenLocation(pointF); 

Это не самое элегантное решение. Надеюсь, это поможет любому, кто находится в такой же ситуации, как я. Подталкивание булавки вверх является только репрезентативным, я все еще читаю оригинальные значения latlong штырей от нашего сервера homebrew, как есть, я просто поместил значения latlong немного вверх во время размещения маркера.

Масштабирование также, похоже, не зависит от этого, я попытался как не помещать его пикселями, а один с использованием этого решения.

Как я уже сказал, если это совершенно неправильно. Дай мне знать.

Если есть какие-либо оговорки в отношении этого подхода. Пожалуйста, дайте мне знать.

+0

Можете ли вы просто показать скриншот проблемы, с которой вы сталкиваетесь, поскольку ее очень неясно из описания. –

+0

Опубликовать код, что вы пробовали? –

+0

Извините, я никогда не пробовал код, моя работа довольно проста. Учитывая, что штырь говорит 250x250, сделайте высоту этого штыря двойным, чтобы он составлял 250x500. Причиной этого является то, что когда штифт вставлен на место (при условии, что он позиционирует его в центре спрайта/пин/значок/вытягиваемый), будет видно, что кончик значка указывает на то, где я на самом деле был выбран. Существует оговорка, выбор этого эффекта очень заметен. выбирая под штифт (даже при отсутствии штифта ниже) срабатывает обратный вызов. Я буду следить за активом, который у меня есть, и некоторым кодом. –

ответ

1

С выпуском 4.2.0 на прошлой неделе у нас есть три способа добавления маркеров. Текущий способ их добавления действительно означает, что вам нужно будет добавить дополнение к вашему изображению, чтобы изображение было центрировано (это то, что мы делаем с default marker).

Второй вариант у вас есть MarkerViews. Просто замените эту строку:

MarkerOptions markerOption = new MarkerOptions(); 

к этому:

MarkerViewOptions markerOption = new MarkerViewOptions(); 

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

Третий вариант будет использовать стиль Runtime Styling для создания слоя символов и использования свойства offset, найденного в style spec. Посмотрите на this example в нашем демонстрационном приложении, чтобы лучше понять потенциал использования стиля исполнения.

+0

Привет, просто возвращайся после стольких дней. Я еще не понял. Во всем предлагаемом вами решении только MarkerViewOptions подходит для нашего проекта. Но это не синхронизация с панорамированием и масштабированием. Стиль исполнения не может быть использован, так как мы извлекаем «внешний вид» булавки и на моем конце Android. Я собираю эти фрагменты в растровое изображение, которое MarkerOption с удовольствием ест. Я придумал другое решение, которое перемещает штырь на определенное положение экрана (перемещение по пикселю). Это работает как шарм, но при масштабировании положение неточно. Любое решение для этого еще? –

Смежные вопросы