Этот метод позволяет вам определить видимую область на карте, чтобы сообщить карте, что части карты по краям могут быть скрыты, путем установки отступов на каждом из четырех краев карты. Функции карты будут адаптированы к заполнению. Например, элементы управления масштабированием, компас, уведомления об авторских правах и логотип Google будут перемещены так, чтобы соответствовать определенному региону, движения камеры будут относиться к центру видимой области и т. Д.
Да, вы можете изменить положение кнопок 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);
}
personvovkabschedule19.02.2013
comment
Как вы можете гарантировать, что mapFragment.getView (). FindViewById (0x1); всегда будет возвращать RelativeLayout с элементами управления масштабированием? Насколько мне известно, обычно это случайное целое число, генерируемое инструментами Android, когда они генерируют класс R. Я что-то упускаю?
- personRobert Estivill; 19.02.2013
comment
Потому что они явно выполняют ZoomControl.setId (1) и MyLocationButton.setId (2). Так что он должен работать нормально, пока они не изменят идентификаторы. И есть еще третий элемент управления с 0x3, но я не уверен, для чего он нужен.
- personvovkab; 19.02.2013
comment
Спасибо за ваш ответ. Тем не менее, я сохраню принятый ответ, потому что это взлом и не подтвержден документацией.
- personRobert Estivill; 20.02.2013
comment
Я использую конструкцию GoogleMap gMap2 = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapViewAPI2)).getMap(); и не могу определить, как получить доступ к mapFragment, на который вы ссылались. Вы можете посоветовать? Спасибо!
- personPeteH; 10.04.2013
comment
Фрагмент вашей карты: SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapViewAPI2); Если вам нужен объект GoogleMap, вы можете: GoogleMap gMap2 = mapFragment.getMap(); - personvovkab; 13.04.2013
comment
Спасибо за ответ и за руководство по фрагменту карты. Я только что поставил тебе +1.
- personPeteH; 15.04.2013
comment
Это безумно хрупко. Эти значения могут измениться с любым выпуском Maps V2. Просто скройте встроенные элементы управления масштабированием и добавьте свои собственные.
- personCommonsWare; 30.04.2013
comment
Привет, вовкаб, можно ли переместить (т.е. на 50 градусов ниже) кнопку компаса на карте v2? Если есть возможность, дайте ответ.
- personHelal Khan; 05.05.2013
comment
Несмотря на то, что это взлом, тем не менее он потрясающий. Престижность! Кстати, каков будет идентификатор для компаса?
- personSheharyar; 08.08.2013
comment
@vovkab добавление, если вы хотите выровнять по центру по вертикали, попробуйте, это работает для меня ( ( LinearLayout ) zoomControls ).setGravity( Gravity.CENTER_VERTICAL ); - personxpto; 10.10.2013
comment
Хоть и хрупкое, но изумительное решение. Одна проблема: он отлично работает для элементов управления масштабированием, но не работает для кнопки моего местоположения. Он растягивается и покрывает весь фрагмент (как если бы он был выровнен по 4-м углам). Я даже пытался создать новый LayourParams, но он продолжает делать то же самое :(
- personluixal; 13.10.2013
comment
Фактически, использование params.removeRule(RelativeLayout.ALIGN_PARENT_TOP) и params.removeRule(RelativeLayout.ALIGN_PARENT_RIGHT); и добавление выравнивания по нижнему и левому краям дает трюк, но removeRule доступен только в SDK 17, что отстой.
- personluixal; 13.10.2013
comment
Просто чтобы добавить Toolbar Id = 0x3
- personBostonGeorge; 30.10.2015
comment
MapView в настоящее время не поддерживает Left и Right, как ALIGN_PARENT_LEFT и setMargin. Вместо этого используйте Start и End, например ALIGN_PARENT_START и params.setMarginStart (margin)
- personnitinkumarp; 25.05.2017
// 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);
}
personIngoschedule22.01.2018
comment
Спасибо! это именно то, что мне нужно. Другие решения на SO либо устарели, либо не работали для меня. Мне просто пришлось использовать zoomControls.setPadding(20,0,0,20);, потому что margin не сработало, не знаю почему.
- personybloodz; 30.07.2020