it-swarm.com.ru

Android Google Map API V2: откройте окно пользовательской информации на правой стороне маркера

Я интегрировал Google MAP API V2 для Android. Я хочу иметь пользовательское информационное окно на Onclick of My Marker. До этого все нормально. Я должен интегрировать это. 

Что я хочу: Я хочу показать свое окно пользовательской информации на правой стороне маркера вместо верхней части маркера.

Ниже приведен код, который я использую: 

public class MainActivity extends FragmentActivity {

    private MainMapFragement mapFragment;
    private HashMap<Marker, EventInfo> eventMarkerMap;


    Marker ThirdMarker;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mapFragment = new MainMapFragement();
        // FragmentTransaction ft = getFragmentManager().beginTransaction();
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.add(R.id.map, mapFragment);
        ft.commit();

    }

    @Override
    protected void onStart() {
        super.onStart();
        setUpEventSpots();
    }

    private void setUpEventSpots() {
        // I'm going to make 2 EventInfo objects and place them on the map
        EventInfo firstEventInfo = new EventInfo(new LatLng(50.154, 4.35),
                "Right now - event", new Date(), "Party");
        EventInfo secondEventInfo = new EventInfo(new LatLng(51.25, 4.15),
                "Future Event", new Date(1032, 5, 25), "Convention");

        EventInfo thirdEventInfo = new EventInfo(new LatLng(23.25, 72.15),
                "Our Next Event", new Date(), "Ahmedabad-India");
        // this date constructor is deprecated but it's just to make a simple
        // example

        Marker firstMarker = mapFragment.placeMarker(firstEventInfo);
        Marker secondMarker = mapFragment.placeMarker(secondEventInfo);
        ThirdMarker = mapFragment.placeMarker(thirdEventInfo);
        eventMarkerMap = new HashMap<Marker, EventInfo>();
        eventMarkerMap.put(firstMarker, firstEventInfo);
        eventMarkerMap.put(secondMarker, secondEventInfo);
        eventMarkerMap.put(ThirdMarker, thirdEventInfo);

        // add the onClickInfoWindowListener
        mapFragment.getMap().setOnInfoWindowClickListener(
                new OnInfoWindowClickListener() {

                    @Override
                    public void onInfoWindowClick(Marker marker) {
                        EventInfo eventInfo = eventMarkerMap.get(marker);
                        Toast.makeText(
                                getBaseContext(),
                                "The date of "
                                        + eventInfo.getName()
                                        + " is "
                                        + eventInfo.getSomeDate()
                                                .toLocaleString(),
                                Toast.LENGTH_LONG).show();

                    }
                });



        // Custom Bhavesh
        mapFragment.getMap().setInfoWindowAdapter(new InfoWindowAdapter() {

            private final View window = getLayoutInflater().inflate(
                    R.layout.ballonoverlly, null);

            @Override
            public View getInfoWindow(Marker marker) {
                EventInfo eventInfo = eventMarkerMap.get(marker);

                String title = marker.getTitle();
                TextView txtTitle = ((TextView) window
                        .findViewById(R.id.textview_name));
                if (title != null) {
                    // Spannable string allows us to edit the formatting of the
                    // text.
                    SpannableString titleText = new SpannableString(title);
                    titleText.setSpan(new ForegroundColorSpan(Color.RED), 0,
                            titleText.length(), 0);
                    txtTitle.setText(titleText);
                } else {
                    txtTitle.setText("");
                }

                // TextView txtType = ((TextView) window
                // .findViewById(R.id.textview_aboutme));
                // if (eventInfo.getType() != null)
                // txtType.setText(eventInfo.getType());

                return window;
            }

            @Override
            public View getInfoContents(Marker marker) {
                // this method is not called if getInfoWindow(Marker) does not
                // return null
                return null;
            }
        });
    }

}

xML-файл: 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/RlMain"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content" >


    <LinearLayout
        Android:id="@+id/imageview_comment"
        Android:layout_width="150dp"
        Android:layout_height="62dp"
        Android:background="@drawable/map_comment_back"
        Android:gravity="center_vertical"
        Android:orientation="vertical"
        Android:scaleType="fitXY"
        Android:visibility="visible" >

        <TextView
            Android:id="@+id/textview_name"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_centerVertical="true"
            Android:layout_marginLeft="10dp"
            Android:text="Bhavesh Patadiya"
            Android:textColor="#FFFFFF"
            Android:textStyle="bold" />

        <TextView
            Android:id="@+id/textview_aboutme"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_centerVertical="true"
            Android:layout_marginLeft="10dp"
            Android:maxLines="2"
            Android:text="How&apos;s Going?"
            Android:textColor="#FFFFFF"
            Android:textStyle="normal" />
    </LinearLayout>
</LinearLayout>

Ниже скриншот того, что я получаю: enter image description here

Теперь я хочу, чтобы мое собственное окно InfoWindow было справа от маркера, а не сверху. 

Все помощь приветствуется. 

Заранее спасибо.

27
Bhavesh Patadiya

Правка 2:

Начиная с сентября было добавлено обновление (v12 или 3.2.65) Google Maps Android API v2 MarkerOptions.infoWindowAnchor . Есть довольно много новых функций, так что проверьте заметки о выпуске тоже.

Правка 3:

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


Это не возможно в настоящее время.

Попытка обойти это, поместив View вместо MapFragment, может быть хорошим решением, если пользователям не разрешено перемещать карту. Если они могут, вы увидите некоторые плохие лаги при репозиционировании при использовании «Push techonology» onCameraChange или опроса с Handler и map.getCameraPosition().

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

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

Правка:

Начиная с версии 3.1.36 (версия 7) API v2 вы можете изменить значок маркера. Это означает, что вы можете сделать две иконки: одну обычную, а другую, как будто у вас есть информационное окно, открытое справа. Отключение открытия информационного окна по умолчанию и использование его вместо этого может помочь вам.

7
MaciejGórski

Вы можете сделать это простым преобразованием marker.getPosition () в screenPosition, как показано ниже.

Projection projection = map.getProjection();
LatLng markerLocation = marker.getPosition();
Point screenPosition = projection.toScreenLocation(markerLocation);

int x = screenPosition.x +marker. markerImage.getWidth();

Вы можете сослаться на ссылку ниже для получения дополнительной информации (которая преобразует getPosition в проекцию):

Как получить координаты экрана от маркера в Google Maps v2 Android

0
javid piprani