Gerenciar eventos do mouse

Selecione a plataforma: Android iOS JavaScript

Corresponda elementos de dados a eventos mousemove e click e use-os para mudar a aparência de um elemento com base na interação do usuário.

Ativar eventos da camada do conjunto de dados

Siga estas etapas para ativar eventos em uma camada de conjunto de dados:

  1. Registre uma camada de conjunto de dados para notificações de evento chamando a função addListener() na camada para cada evento que você quer registrar. Neste exemplo, o mapa também recebe um listener.

    TypeScript

    datasetLayer = innerMap.getDatasetFeatureLayer(datasetId);
    datasetLayer.style = applyStyle;
    
    datasetLayer.addListener('click', handleClick);
    datasetLayer.addListener('mousemove', handleMouseMove);
    
    // Map event listener.
    innerMap.addListener('mousemove', () => {
        // If the map gets a mousemove, that means there are no feature layers
        // with listeners registered under the mouse, so we clear the last
        // interacted feature ids.
        if (lastInteractedFeatureIds?.length) {
            lastInteractedFeatureIds = [];
            datasetLayer.style = applyStyle;
        }
    });

    JavaScript

    datasetLayer = innerMap.getDatasetFeatureLayer(datasetId);
    datasetLayer.style = applyStyle;
    
    datasetLayer.addListener('click', handleClick);
    datasetLayer.addListener('mousemove', handleMouseMove);
    
    // Map event listener.
    innerMap.addListener('mousemove', () => {
        // If the map gets a mousemove, that means there are no feature layers
        // with listeners registered under the mouse, so we clear the last
        // interacted feature ids.
        if (lastInteractedFeatureIds?.length) {
            lastInteractedFeatureIds = [];
            datasetLayer.style = applyStyle;
        }
    });

  2. Adicione o código do manipulador de eventos para estilizar o elemento selecionado com base no tipo de interação.

    TypeScript

    // Note, 'globalid' is an attribute in this Dataset.
    function handleClick(event: google.maps.FeatureMouseEvent) {
        if (event.features) {
            lastClickedFeatureIds = event.features.map(
                (f) => (f as google.maps.DatasetFeature).datasetAttributes.globalid
            );
        }
        datasetLayer.style = applyStyle;
    }
    
    function handleMouseMove(event: google.maps.FeatureMouseEvent) {
        if (event.features) {
            lastInteractedFeatureIds = event.features.map(
                (f) => (f as google.maps.DatasetFeature).datasetAttributes.globalid
            );
        }
        datasetLayer.style = applyStyle;
    }

    JavaScript

    // Note, 'globalid' is an attribute in this Dataset.
    function handleClick(event) {
        if (event.features) {
            lastClickedFeatureIds = event.features.map(
                (f) => f.datasetAttributes.globalid
            );
        }
        datasetLayer.style = applyStyle;
    }
    
    function handleMouseMove(event) {
        if (event.features) {
            lastInteractedFeatureIds = event.features.map(
                (f) => f.datasetAttributes.globalid
            );
        }
        datasetLayer.style = applyStyle;
    }

  3. Use uma função de estilo de elemento para aplicar estilos. A função de estilo de elemento mostrado aqui aplica condicionalmente o estilo com base no tipo de interação. Neste exemplo, são definidos três estilos: um para aplicar o negrito na borda em mousemove, outro para mudar o plano de fundo em click e um estilo padrão.

    TypeScript

    const styleDefault = {
        strokeColor: 'green',
        strokeWeight: 2.0,
        strokeOpacity: 1.0,
        fillColor: 'green',
        fillOpacity: 0.3,
    };
    
    const styleClicked = {
        ...styleDefault,
        strokeColor: 'blue',
        fillColor: 'blue',
        fillOpacity: 0.5,
    };
    
    const styleMouseMove = {
        ...styleDefault,
        strokeWeight: 4.0,
    };
    
    function applyStyle(params: google.maps.FeatureStyleFunctionOptions) {
        const datasetFeature = params.feature;
    
        // Note, 'globalid' is an attribute in this dataset.
        if (
            lastClickedFeatureIds.includes(
                (datasetFeature as google.maps.DatasetFeature).datasetAttributes
                    .globalid
            )
        ) {
            return styleClicked;
        }
    
        if (
            lastInteractedFeatureIds.includes(
                (datasetFeature as google.maps.DatasetFeature).datasetAttributes
                    .globalid
            )
        ) {
            return styleMouseMove;
        }
        return styleDefault;
    }

    JavaScript

    const styleDefault = {
        strokeColor: 'green',
        strokeWeight: 2.0,
        strokeOpacity: 1.0,
        fillColor: 'green',
        fillOpacity: 0.3,
    };
    
    const styleClicked = {
        ...styleDefault,
        strokeColor: 'blue',
        fillColor: 'blue',
        fillOpacity: 0.5,
    };
    
    const styleMouseMove = {
        ...styleDefault,
        strokeWeight: 4.0,
    };
    
    function applyStyle(params) {
        const datasetFeature = params.feature;
    
        // Note, 'globalid' is an attribute in this dataset.
        if (
            lastClickedFeatureIds.includes(
                datasetFeature.datasetAttributes.globalid
            )
        ) {
            return styleClicked;
        }
    
        if (
            lastInteractedFeatureIds.includes(
                datasetFeature.datasetAttributes.globalid
            )
        ) {
            return styleMouseMove;
        }
        return styleDefault;
    }

Exemplo de código completo

TypeScript

const mapElement = document.querySelector('gmp-map')!;
let innerMap: google.maps.Map;
let lastInteractedFeatureIds: string[] = [];
let lastClickedFeatureIds: string[] = [];
let datasetLayer: google.maps.FeatureLayer;

// Note, 'globalid' is an attribute in this Dataset.
function handleClick(event: google.maps.FeatureMouseEvent) {
    if (event.features) {
        lastClickedFeatureIds = event.features.map(
            (f) => (f as google.maps.DatasetFeature).datasetAttributes.globalid
        );
    }
    datasetLayer.style = applyStyle;
}

function handleMouseMove(event: google.maps.FeatureMouseEvent) {
    if (event.features) {
        lastInteractedFeatureIds = event.features.map(
            (f) => (f as google.maps.DatasetFeature).datasetAttributes.globalid
        );
    }
    datasetLayer.style = applyStyle;
}

async function init() {
    // Request needed libraries.
    await google.maps.importLibrary('maps');

    // Get the inner map.
    innerMap = mapElement.innerMap;

    // Dataset ID for NYC park data.
    const datasetId = 'a75dd002-ad20-4fe6-af60-27cd2ed636b4';

    datasetLayer = innerMap.getDatasetFeatureLayer(datasetId);
    datasetLayer.style = applyStyle;

    datasetLayer.addListener('click', handleClick);
    datasetLayer.addListener('mousemove', handleMouseMove);

    // Map event listener.
    innerMap.addListener('mousemove', () => {
        // If the map gets a mousemove, that means there are no feature layers
        // with listeners registered under the mouse, so we clear the last
        // interacted feature ids.
        if (lastInteractedFeatureIds?.length) {
            lastInteractedFeatureIds = [];
            datasetLayer.style = applyStyle;
        }
    });
}

const styleDefault = {
    strokeColor: 'green',
    strokeWeight: 2.0,
    strokeOpacity: 1.0,
    fillColor: 'green',
    fillOpacity: 0.3,
};

const styleClicked = {
    ...styleDefault,
    strokeColor: 'blue',
    fillColor: 'blue',
    fillOpacity: 0.5,
};

const styleMouseMove = {
    ...styleDefault,
    strokeWeight: 4.0,
};

function applyStyle(params: google.maps.FeatureStyleFunctionOptions) {
    const datasetFeature = params.feature;

    // Note, 'globalid' is an attribute in this dataset.
    if (
        lastClickedFeatureIds.includes(
            (datasetFeature as google.maps.DatasetFeature).datasetAttributes
                .globalid
        )
    ) {
        return styleClicked;
    }

    if (
        lastInteractedFeatureIds.includes(
            (datasetFeature as google.maps.DatasetFeature).datasetAttributes
                .globalid
        )
    ) {
        return styleMouseMove;
    }
    return styleDefault;
}

void init();

JavaScript

const mapElement = document.querySelector('gmp-map');
let innerMap;
let lastInteractedFeatureIds = [];
let lastClickedFeatureIds = [];
let datasetLayer;

// Note, 'globalid' is an attribute in this Dataset.
function handleClick(event) {
    if (event.features) {
        lastClickedFeatureIds = event.features.map(
            (f) => f.datasetAttributes.globalid
        );
    }
    datasetLayer.style = applyStyle;
}

function handleMouseMove(event) {
    if (event.features) {
        lastInteractedFeatureIds = event.features.map(
            (f) => f.datasetAttributes.globalid
        );
    }
    datasetLayer.style = applyStyle;
}

async function init() {
    // Request needed libraries.
    await google.maps.importLibrary('maps');

    // Get the inner map.
    innerMap = mapElement.innerMap;

    // Dataset ID for NYC park data.
    const datasetId = 'a75dd002-ad20-4fe6-af60-27cd2ed636b4';

    datasetLayer = innerMap.getDatasetFeatureLayer(datasetId);
    datasetLayer.style = applyStyle;

    datasetLayer.addListener('click', handleClick);
    datasetLayer.addListener('mousemove', handleMouseMove);

    // Map event listener.
    innerMap.addListener('mousemove', () => {
        // If the map gets a mousemove, that means there are no feature layers
        // with listeners registered under the mouse, so we clear the last
        // interacted feature ids.
        if (lastInteractedFeatureIds?.length) {
            lastInteractedFeatureIds = [];
            datasetLayer.style = applyStyle;
        }
    });
}

const styleDefault = {
    strokeColor: 'green',
    strokeWeight: 2.0,
    strokeOpacity: 1.0,
    fillColor: 'green',
    fillOpacity: 0.3,
};

const styleClicked = {
    ...styleDefault,
    strokeColor: 'blue',
    fillColor: 'blue',
    fillOpacity: 0.5,
};

const styleMouseMove = {
    ...styleDefault,
    strokeWeight: 4.0,
};

function applyStyle(params) {
    const datasetFeature = params.feature;

    // Note, 'globalid' is an attribute in this dataset.
    if (
        lastClickedFeatureIds.includes(
            datasetFeature.datasetAttributes.globalid
        )
    ) {
        return styleClicked;
    }

    if (
        lastInteractedFeatureIds.includes(
            datasetFeature.datasetAttributes.globalid
        )
    ) {
        return styleMouseMove;
    }
    return styleDefault;
}

void init();