Android Maps Library V2 позволяет настраивать масштаб управления масштабированием

Как я могу настроить положение встроенных элементов управления масштабированием в GoogleMap V2?

По этой теме для версии 1 библиотеки Google Maps возникает множество вопросов.

Размещение элементов управления масштабированием в MapView

Как изменить положение встроенных элементов управления масштабированием в MapView?

Как управлять масштабированием макета с помощью setBuiltInZoomControls (true)?

Однако я не смог найти никаких вопросов относительно V2 библиотеки.

В V2 нет метода

(LinearLayout) mapView.getZoomControls();

все ранее упомянутые вопросы устаревают.

заранее спасибо


person Robert Estivill    schedule 28.12.2012    source источник


Ответы (4)


В зависимости от того, что вы пытаетесь сделать, вы можете найти GoogleMap.setPadding () полезно (добавлено в сентябре 2013 г.).

map.setPadding(leftPadding, topPadding, rightPadding, bottomPadding);

Из документации API:

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

Также см. описание того, как заполнение работает в GoogleMap.

person Mark Doliner    schedule 05.12.2013

Да, вы можете изменить положение кнопок ZoomControl и MyLocation с помощью небольшого взлома. В моем примере у меня есть SupportMapFragment, который создается из макета xml.

Просмотр идентификаторов кнопок ZoomControl и MyLocation:

ZoomControl id = 0x1
MyLocation button id = 0x2

Код для обновления позиции ZoomControl:

// Find map fragment
SupportMapFragment mapFragment = (SupportMapFragment) getFragmentManager().findFragmentById(R.id.map);

// Find ZoomControl view
View zoomControls = mapFragment.getView().findViewById(0x1);

if (zoomControls != null && zoomControls.getLayoutParams() instanceof RelativeLayout.LayoutParams) {
    // ZoomControl is inside of RelativeLayout
    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) zoomControls.getLayoutParams();

    // Align it to - parent top|left
    params.addRule(RelativeLayout.ALIGN_PARENT_TOP);
    params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);

    // Update margins, set to 10dp
    final int margin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10,
            getResources().getDisplayMetrics());
    params.setMargins(margin, margin, margin, margin);
}
person vovkab    schedule 19.02.2013
comment
Как вы можете гарантировать, что mapFragment.getView (). FindViewById (0x1); всегда будет возвращать RelativeLayout с элементами управления масштабированием? Насколько мне известно, обычно это случайное целое число, генерируемое инструментами Android, когда они генерируют класс R. Я что-то упускаю? - person Robert Estivill; 19.02.2013
comment
Потому что они явно выполняют ZoomControl.setId (1) и MyLocationButton.setId (2). Так что он должен работать нормально, пока они не изменят идентификаторы. И есть еще третий элемент управления с 0x3, но я не уверен, для чего он нужен. - person vovkab; 19.02.2013
comment
Спасибо за ваш ответ. Тем не менее, я сохраню принятый ответ, потому что это взлом и не подтвержден документацией. - person Robert Estivill; 20.02.2013
comment
Я использую конструкцию GoogleMap gMap2 = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapViewAPI2)).getMap(); и не могу определить, как получить доступ к mapFragment, на который вы ссылались. Вы можете посоветовать? Спасибо! - person PeteH; 10.04.2013
comment
Фрагмент вашей карты: SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapViewAPI2); Если вам нужен объект GoogleMap, вы можете: GoogleMap gMap2 = mapFragment.getMap(); - person vovkab; 13.04.2013
comment
Спасибо за ответ и за руководство по фрагменту карты. Я только что поставил тебе +1. - person PeteH; 15.04.2013
comment
Это безумно хрупко. Эти значения могут измениться с любым выпуском Maps V2. Просто скройте встроенные элементы управления масштабированием и добавьте свои собственные. - person CommonsWare; 30.04.2013
comment
Привет, вовкаб, можно ли переместить (т.е. на 50 градусов ниже) кнопку компаса на карте v2? Если есть возможность, дайте ответ. - person Helal Khan; 05.05.2013
comment
Несмотря на то, что это взлом, тем не менее он потрясающий. Престижность! Кстати, каков будет идентификатор для компаса? - person Sheharyar; 08.08.2013
comment
@vovkab добавление, если вы хотите выровнять по центру по вертикали, попробуйте, это работает для меня ( ( LinearLayout ) zoomControls ).setGravity( Gravity.CENTER_VERTICAL ); - person xpto; 10.10.2013
comment
Хоть и хрупкое, но изумительное решение. Одна проблема: он отлично работает для элементов управления масштабированием, но не работает для кнопки моего местоположения. Он растягивается и покрывает весь фрагмент (как если бы он был выровнен по 4-м углам). Я даже пытался создать новый LayourParams, но он продолжает делать то же самое :( - person luixal; 13.10.2013
comment
Фактически, использование params.removeRule(RelativeLayout.ALIGN_PARENT_TOP) и params.removeRule(RelativeLayout.ALIGN_PARENT_RIGHT); и добавление выравнивания по нижнему и левому краям дает трюк, но removeRule доступен только в SDK 17, что отстой. - person luixal; 13.10.2013
comment
Просто чтобы добавить Toolbar Id = 0x3 - person BostonGeorge; 30.10.2015
comment
MapView в настоящее время не поддерживает Left и Right, как ALIGN_PARENT_LEFT и setMargin. Вместо этого используйте Start и End, например ALIGN_PARENT_START и params.setMarginStart (margin) - person nitinkumarp; 25.05.2017

Я использую MapFragment, а не SupportMapFragment:

import android.util.TypedValue;

в onCreate

    // Find map fragment

    MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.mapview);

    int ZoomControl_id = 0x1;
    int MyLocation_button_id = 0x2;

    // Find ZoomControl view
    View zoomControls = mapFragment.getView().findViewById(ZoomControl_id);

    if (zoomControls != null && zoomControls.getLayoutParams() instanceof RelativeLayout.LayoutParams) {
        // ZoomControl is inside of RelativeLayout
        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) zoomControls.getLayoutParams();

        // Align it to - parent top|left
        params.addRule(RelativeLayout.ALIGN_PARENT_TOP);
        params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);

        // Update margins, set to 10dp
        final int margin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10,
                getResources().getDisplayMetrics());
        params.setMargins(margin, margin, margin, margin);
    }
person Ingo    schedule 22.01.2018
comment
Спасибо! это именно то, что мне нужно. Другие решения на SO либо устарели, либо не работали для меня. Мне просто пришлось использовать zoomControls.setPadding(20,0,0,20);, потому что margin не сработало, не знаю почему. - person ybloodz; 30.07.2020

Только для записи:

Элементы управления навигацией 0x4

Итого:

@LayoutRes final int ZOOM_CONTROL_ID = 0x1;
@LayoutRes final int MY_LOCATION_CONTROL_ID = 0x2;
@LayoutRes final int NAVIGATION_CONTROL_ID = 0x4;
person Langusten Gustel    schedule 17.05.2016