osmdroid заобиколно решение за припокриване на класическите маркери

Разработвам приложение за офлайн картографиране на Android, като използвам osmdroid и osm bonus pack и зареждам плочките и данните от външно хранилище. В момента, когато данните растат, маркерите започват да се сблъскват, дори имам ситуация на две места в една и съща сграда. Знам, че този вид проблем е задаван много преди, моят е за просто временно решение, което мисля да внедря. Какво ще кажете, ако две места са достатъчно близо (точно едно над друго!), стандартният информационен прозорец изскача като ListView с всеки ред, проектиран като стандартния балон (изображение, заглавие, moreInfoButton).

Въпросът ми е: някои мисли или съвети как да създадете новия файл с оформление bonuspack_bubble.xml.


person maxandonuts    schedule 30.03.2014    source източник
comment
Обикновено трябва да се използва групиране на щифтове. Не знам дали има библиотеки за osmdroid, но за google maps v2 със сигурност има.   -  person Mixaz    schedule 20.10.2014


Отговори (1)


Не знам дали това ще ти помогне. Трябваше да създам CustomInfoBubble за моя проект. Това, което направих, беше да разширя класа по подразбиране InfoWindow и да му предам моето персонализирано оформление на балончета. Нещо подобно: http://mobiledevstories.wordpress.com/2014/03/01/osmdroid-bonus-pack-markers-with-clickable-infowindows/

Моят Java клас MapCustomInfoBubble изглежда така:

public class MapCustomInfoBubble extends InfoWindow {

    public MapCustomInfoBubble(MapView mapView) {
        super(R.layout.map_infobubble_black, mapView);//my custom layout and my mapView
    }

    @Override
    public void onClose() {
      //by default, do nothing
    }

    @Override
    public void onOpen(Object item) {
        Marker marker = (Marker)item; //the marker on which you click to open the bubble    

        String title = marker.getTitle();
        if (title == null)
                title = "";

        Button moreInfo = (Button)mView.findViewById(R.id.bubble_moreinfo);//the button that I have in my XML; 
        moreInfo.setText(title);
        moreInfo.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
             gotoMoreInfoWindow();//custom method; starts another activity
            }
        });
    }

}

В моя XML файл имам:

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:orientation="horizontal"
    android:background="@drawable/map_infobubble_black" >
        <LinearLayout 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" 
            android:orientation="horizontal" >
            <TextView android:id="@+id/bubble_title" 
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#FFFFFF" 
                android:maxEms="17"
                android:layout_gravity="left"
                android:layout_weight="1"
                android:text="Title" />
            <Button android:id="@+id/bubble_moreinfo" 
                android:background="@drawable/map_btn_moreinfo"
                android:visibility="visible"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" 
                android:layout_gravity="right"
                android:layout_weight="0" />
        </LinearLayout>
</LinearLayout>

След това някъде другаде в моя код използвам:

Marker wp = new Marker(mapView);
wp.setPosition(new GeoPoint(mylocation.getMyLocation()));
wp.setTitle(editTextName.getText().toString());
wp.setInfoWindow(new MapCustomInfoBubble(mapView));
mapView.getOverlays().add(wp);
mapView.invalidate();

В моя код задавам текста на button със заглавието на Marker. Marker е елементът, върху който кликвам. Ако искате да поставите информация за повече маркери в едно и също InfoWindow (вътре в ListView), мисля, че трябва да знаете предварително каква ще бъде информацията.

Вярвам, че можете да поставите какъвто код искате вътре в onOpen(), но не съм толкова сигурен дали това е добра практика. Можете да опитате да създадете персонализиран Constructor и да поставите логиката си там. Би трябвало да работи. Трябва да предадете Resource Id (оформление) и mapView на супер конструктора, така че да върне валиден mView обект.

person nightfixed    schedule 02.04.2014
comment
моля, поправете, ако греша, но вие правите по време на изпълнение модификациите, добре не точните, за които говоря в xml файла, имам предвид да имам CustomInfoWindow, това, което се опитвам да направя, е вместо да покажа a единичен CustomInfoWindow, когато два маркера са твърде близо, показва ListView в CustomInfoWindow, като всеки ред представлява едно поведение на CustomInfoWindow с изображение, заглавие, подзаглавие и бутон. - person maxandonuts; 03.04.2014
comment
Получавам Грешка типът MapCustomInfoBubble трябва да имплементира наследения абстрактен метод InfoWindow.onOpen(ExtendedOverlayItem). Опитвам се да създам нов MapCustomInfoBubble под същия пакет. - person kittu88; 21.04.2014
comment
Това не работи. Някъде другаде в моя код къде да го поставя? Какво трябва да бъде името на XML файла, написан по-горе? - person kittu88; 24.04.2014
comment
Някъде другаде в моя код означава, че поставяте тази част от кода в дейността, където го използвате. Не знам къде създавате вашите маркери. XML оформлението се нарича map_infobubble_black, което е същото оформление, което беше използвано като аргумент за супер извикването, вътре в конструктора MapCustomInfoBubble. - person nightfixed; 24.04.2014