É o 15º aniversário da Plataforma Google Maps: confira as notícias e avisos mais recentes

Eventos

Com o Maps SDK for Android, você pode detectar eventos no mapa.

Amostras de código

O repositório ApiDemos no GitHub inclui exemplos que demonstram eventos e listeners:

Eventos de clique normal/longo no mapa

Para responder a uma ação de toque do usuário em um ponto no mapa, utilize um OnMapClickListener, que é definido chamando GoogleMap.setOnMapClickListener(OnMapClickListener). Quando um usuário clica (toca) no mapa, você recebe um evento onMapClick(LatLng) que indica o local do clique. Se você precisar do local correspondente na tela (em pixels), poderá receber uma Projection do mapa, que permite alternar entre coordenadas de latitude/longitude e de pixel da tela.

Também é possível detectar eventos de clique longo com um OnMapLongClickListener, que é definido chamando GoogleMap.setOnMapLongClickListener(OnMapLongClickListener). Ele é semelhante ao listener de clique e é notificado sobre esses eventos com um callback onMapLongClick(LatLng).

Como desativar eventos de clique no Modo Lite

Para desativar os eventos de clique em um mapa no Modo Lite, chame setClickable() na visualização que contém a MapView ou o MapFragment. Isso será útil, por exemplo, ao exibir mapas com uma visualização em lista para que o evento de clique invoque uma ação não relacionada ao mapa.

A opção para desativar esses eventos está disponível apenas no Modo Lite. Desabilitar esses cliques também impedirá os marcadores de receber cliques, mas isso não afetará outros controles no mapa.

No caso de uma MapView:

MapView view;
...
view.setClickable(false);

No caso de um MapFragment:

MapFragment fragment;
...
fragment.getView().setClickable(false);

Eventos de mudança de câmera

A visualização de mapa é modelada como uma câmera apontada para um plano nivelado. Você pode alterar as propriedades da câmera para mudar o nível de zoom, a janela de visualização e a perspectiva do mapa. Consulte o guia sobre a câmera. Os usuários também podem fazer gestos para interagir com ela.

Com listeners de mudança de câmera, é possível registrar os movimentos dela. Seu app pode receber notificações de eventos de início, continuidade e término do movimento. Também é possível ver por que a câmera está se movendo: por gestos do usuário, animações da API integrada ou movimentos controlados pelo desenvolvedor.

O exemplo a seguir mostra todos os listeners de eventos de câmera disponíveis:

public class MyCameraActivity extends FragmentActivity implements
        OnCameraMoveStartedListener,
        OnCameraMoveListener,
        OnCameraMoveCanceledListener,
        OnCameraIdleListener,
        OnMapReadyCallback {

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_camera);

        SupportMapFragment mapFragment =
            (SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap map) {
        mMap = map;

        mMap.setOnCameraIdleListener(this);
        mMap.setOnCameraMoveStartedListener(this);
        mMap.setOnCameraMoveListener(this);
        mMap.setOnCameraMoveCanceledListener(this);

        // Show Sydney on the map.
        mMap.moveCamera(CameraUpdateFactory
                .newLatLngZoom(new LatLng(-33.87365, 151.20689), 10));
    }

    @Override
    public void onCameraMoveStarted(int reason) {

        if (reason == OnCameraMoveStartedListener.REASON_GESTURE) {
            Toast.makeText(this, "The user gestured on the map.",
                           Toast.LENGTH_SHORT).show();
        } else if (reason == OnCameraMoveStartedListener
                                .REASON_API_ANIMATION) {
            Toast.makeText(this, "The user tapped something on the map.",
                           Toast.LENGTH_SHORT).show();
        } else if (reason == OnCameraMoveStartedListener
                                .REASON_DEVELOPER_ANIMATION) {
            Toast.makeText(this, "The app moved the camera.",
                           Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onCameraMove() {
        Toast.makeText(this, "The camera is moving.",
                       Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onCameraMoveCanceled() {
        Toast.makeText(this, "Camera movement canceled.",
                       Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onCameraIdle() {
        Toast.makeText(this, "The camera has stopped moving.",
                       Toast.LENGTH_SHORT).show();
    }
}

Os seguintes listeners de câmera estão disponíveis:

  • O callback onCameraMoveStarted() do OnCameraMoveStartedListener é invocado quando a câmera começa a se mover. O método de callback recebe um reason para o movimento, que pode ser um dos seguintes:

    • REASON_GESTURE indica que a câmera se moveu devido a um gesto do usuário no mapa, como deslocamento, inclinação, movimento de pinça para aumentar o zoom ou rotação do mapa.
    • REASON_API_ANIMATION indica que a API moveu a câmera devido a uma ação do usuário sem gesto, como um toque no botão de zoom ou no botão "Meu local" ou um clique em um marcador.
    • REASON_DEVELOPER_ANIMATION indica que seu app iniciou o movimento da câmera.
  • O callback onCameraMove() do OnCameraMoveListener é invocado várias vezes enquanto a câmera está em movimento ou o usuário está interagindo com o touchscreen. Para entender a frequência com que o callback é invocado, é importante saber que a API chama essa atividade uma vez por frame. No entanto, isso acontece de forma assíncrona e, portanto, não reflete o que aparece na tela. Também é possível manter a mesma posição da câmera entre um callback onCameraMove() e o próximo.

  • O callback OnCameraIdle() do OnCameraIdleListener é invocado quando a câmera para de se mover e o usuário deixa de interagir com o mapa.

  • O callback OnCameraMoveCanceled() do OnCameraMoveCanceledListener é invocado quando o movimento atual da câmera é interrompido. Logo após OnCameraMoveCanceled(), o callback onCameraMoveStarted() é invocado com o novo reason.

    Se o app chamar explicitamente GoogleMap.stopAnimation(), o callback OnCameraMoveCanceled() será invocado, mas não o onCameraMoveStarted().

Para colocar um listener no mapa, chame o método "set-listener" relevante. Por exemplo, se você quiser solicitar um callback do OnCameraMoveStartedListener, invoque GoogleMap.setOnCameraMoveStartedListener().

Você pode conferir o alvo (latitude/longitude), o zoom, a direção e a inclinação da câmera em CameraPosition. Consulte o guia sobre a posição da câmera para ver detalhes sobre essas propriedades.

Eventos em pontos de interesse comerciais e de outros tipos

Por padrão, os pontos de interesse (PDIs) aparecem no mapa básico com os respectivos ícones. Esses pontos incluem parques, escolas, edifícios governamentais e muito mais, além de PDIs comerciais, como lojas, restaurantes e hotéis.

Você pode responder a eventos de clique em um PDI. Consulte o guia sobre pontos de interesse comerciais e de outros tipos.

Eventos de mapa interno

É possível usar eventos para encontrar e personalizar o nível ativo de um mapa interno. Utilize a interface OnIndoorStateChangeListener para definir um listener que será chamado quando o foco mudar para um novo edifício ou outro nível for ativado dentro dele.

Para usar o edifício que está em foco no momento, chame GoogleMap.getFocusedBuilding(). Normalmente, centralizar o mapa em uma latitude/longitude específica retornará o edifício nessas coordenadas, mas nem sempre isso acontece.

Em seguida, você pode encontrar o nível ativo chamando IndoorBuilding.getActiveLevelIndex().

IndoorBuilding building = mMap.getFocusedBuilding();
if (building == null) {
  return null;
}
return building.getLevels().get(building.getActiveLevelIndex());

Isso é útil se você quer exibir uma marcação personalizada para o nível ativo, como marcadores, sobreposições de solo, sobreposições de blocos, polígonos, polilinhas eoutras formas.

Dica: para voltar à rua, confira o nível padrão usando IndoorBuilding.getDefaultLevelIndex() e defina-o como o nível ativo com IndoorLevel.activate().

Eventos de marcador e da janela de informações

Para detectar e responder a eventos de marcador, incluindo clicar e arrastar, defina o listener correspondente no objeto GoogleMap a que o marcador pertence. Consulte o guia sobre eventos de marcador.

Você também pode detectar eventos em janelas de informações.

Eventos de forma e sobreposição

Você pode detectar e responder a eventos de clique em polilinhas, polígonos, círculos e sobreposições de solo.

Eventos de localização

Seu app pode responder aos seguintes eventos relacionados à camada "My Location":

Para ver detalhes, consulte o guia sobre a camada "My Location".