Подтвердить что ты не робот

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

У меня встроенный API 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 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 был на правой стороне маркера вместо Top.

Все Помощи оценены.

Спасибо в Advance.

4b9b3361

Ответ 1

Изменить 2:

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

Изменить 3:

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


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

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

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

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

Edit:

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

Ответ 2

Вы можете сделать простым преобразованием 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