Переместить логотип Google в MapView - PullRequest
23 голосов
/ 03 августа 2011

У меня есть две кнопки в каждом нижнем угле MapView, частично скрывающие логотип Google в левом нижнем углу.

Чтобы выполнить положения и условия API, мне нужно переместить логотип Google в более заметное место. то есть над кнопкой.

Документ Google API гласит, что логотип Google нарисован в onDraw() методе MapView, но я не знаю, как его правильно переопределить, поскольку карты Google являются закрытым исходным кодом.

Я мог бы сделать это в iPhone, найдя правильный UIView у MKMapView's детей, но я не могу понять, как я мог бы сделать это в Android.

Ответы [ 8 ]

31 голосов
/ 03 декабря 2013

Google Maps SDK v2 для Android добавляет эту функцию.

Используйте GoogleMap.setPadding(), чтобы добавить заполнение в «активную» область (включая логотип Google и уведомления об авторских правах), все еще заполняя полный контейнер.

https://developers.google.com/maps/documentation/android/map#map_padding

8 голосов
/ 27 ноября 2017

Вы можете перемещать логотип Google с помощью назначенного ему тега GoogleWatermark. В приведенном ниже коде я переместил его в верхний правый угол экрана.

View googleLogo = binding.missionMap.findViewWithTag("GoogleWatermark");
RelativeLayout.LayoutParams glLayoutParams = (RelativeLayout.LayoutParams)googleLogo.getLayoutParams();
glLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 0);
glLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 0);
glLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_START, 0);
glLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
glLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
googleLogo.setLayoutParams(glLayoutParams);

где missionMap - это структура кадра, к которой был добавлен MapFragment.

8 голосов
/ 06 января 2012

У меня была та же проблема, но вы можете достичь того, что хотите, не вступая в конфликт с Условиями использования Google. Главное, чтобы ваш mapView был размещен в макете Frame, например:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"     
 android:orientation="vertical" >          

 <FrameLayout android:id="@+id/map_frame"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:layout_weight="0.7" >     

    <com.google.android.maps.MapView
        android:id="@+id/map_view" 
        android:layout_width="fill_parent"
        android:layout_height="match_parent" 
        android:enabled="true" 
        android:clickable="true"             
        android:apiKey="mySecretMapsApiKey"/>

 </FrameLayout>

 <ws.mentis.android.guardian.ui.MapNavBar
    android:id="@+id/map_nav"
    android:layout_width="fill_parent"
    android:layout_height="70dip"
    android:layout_gravity="bottom"
    android:layout_weight="0.3" /> 

 </LinearLayout>

Мне нужно было включить несколько кнопок, поэтому я создал их в пользовательском виджете (MapNavBar). Как видно из снимка экрана, логотип Google все еще виден и находится в своем обычном месте в новом окне.

Screenshot of MapView

Это работает в Android 2.2 Преимущество также заключается в том, что стандартный зум-элемент управления также перемещается вверх, поэтому он не мешает вашим собственным кнопкам.

4 голосов
/ 03 января 2012

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

protected final void onDraw(android.graphics.Canvas canvas)

onDraw - последний метод. Это не может быть отменено вообще.

В качестве альтернативы вы можете показать свои кнопки под видом карты в макете, выровненном по родительской нижней части.Таким образом, вы можете располагать кнопки там, где вам нравится, и это не затеняет ваш логотип Google.

1 голос
/ 25 июля 2017

Действительно старый вопрос, но, возможно, кто-то воспользуется им. Я сделал это, чтобы появиться в правом верхнем углу:

Rect rect = new Rect()
mMapView.getLocalVisibleRect(rect)
googleMap.setPadding(rect.width() - 100, 0, 0, rect.height() - 50)

Если вы хотите разместить его где-то еще, вам нужно повеселиться с setPadding

Также не забудьте скрыть кнопки интерфейса Google Maps:

googleMap.getUiSettings().setMapToolbarEnabled(false)
googleMap.getUiSettings().setZoomControlsEnabled(false)
googleMap.getUiSettings().setMyLocationButtonEnabled(false)

Есть одна (по крайней мере) проблема. При использовании камеры центрирование карты по заданной точке не будет работать должным образом. Если необходимо движение камеры, лучше установить отступ для видимого фрагмента карты, и он должен работать правильно. Используйте прямоугольник, чтобы узнать, какие размеры поместить в setPadding

0 голосов
/ 20 мая 2019

Я достиг этого, сделав следующее.

<RelativeLayout
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:layout_marginBottom="-30dp"
  android:layout_marginTop="-30dp">

   <fragment
      android:id="@+id/map_frag_main"
      android:name="com.google.android.gms.maps.SupportMapFragment"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      tools:context=".MainActivity" />

</RelativeLayout>

Это приведет к удалению логотипа Google и не будет необходимости в заполнении, просто убедитесь, что вы добавили ничью, иначе вы нарушите TOS.

0 голосов
/ 13 сентября 2018

Вам нечего делать, кроме использования отступов для объекта GoogleMap, как указано в документации к Google Maps. Примечание. Согласно Условиям использования Google Maps Platform ваше приложение не должно удалять или скрывать логотип Google или уведомления об авторских правах.Заполнение карты позволяет при необходимости изменить положение этих элементов.Если пользовательский интерфейс отображается внизу карты, добавьте отступы внизу карты, чтобы логотип и официальные уведомления всегда были видны.

0 голосов
/ 26 марта 2012

Вроде хак, но вы можете попробовать добавить MapView к FrameLayout,, установив высоту MapView X dp больше, чем FrameLayout, чтобы обрезать его, и добавить логотип Drawable где бы вы ни хотели.

...