Haz que los componentes de datos respondan a los eventos click
y úsalos para cambiar el aspecto de un componente según la interacción del usuario.
Cómo escribir un controlador de eventos de clic
Cuando se produce un evento de clic en una capa de componentes, el SDK de Maps para Android pasa un objeto FeatureClickEvent
al controlador de eventos.
Usa el método FeatureClickEvent.getFeatures()
para obtener la lista de funciones afectadas por el clic.
Cómo controlar eventos de la capa de componentes
Sigue estos pasos para controlar los eventos en la capa Datasets. En este ejemplo, aplicarás un relleno y un borde azules al polígono que representa el componente seleccionado.
Cuando llamas a FeatureLayer.setFeatureStyle()
, la función de fábrica de diseño establece el diseño de todos los componentes del conjunto de datos. Para actualizar el diseño de un conjunto de datos en el controlador de eventos, debes llamar a FeatureLayer.setFeatureStyle()
para configurar el diseño actualizado en todos los componentes del conjunto de datos.
Si aún no lo hiciste, sigue los pasos que se indican en Cómo comenzar para crear un ID y un diseño de mapa nuevos. Asegúrate de habilitar la capa del componente Conjuntos de datos.
Asegúrate de que tu clase implemente
FeatureLayer.OnFeatureClickListener
.Registra un controlador de eventos para eventos de clic de funciones llamando a
FeatureLayer.addOnFeatureClickListener()
.Kotlin
private var datasetLayer: FeatureLayer? = null // The globalid of the clicked dataset feature. var lastGlobalId: String? = null
override fun onMapReady(googleMap: GoogleMap) { // Get the DATASET feature layer. datasetLayer = googleMap.getFeatureLayer(FeatureLayerOptions.Builder() .featureType(FeatureType.DATASET) // Specify the dataset ID. .datasetId(YOUR_DATASET_ID) .build())
// Register the click event handler for the Datasets layer. datasetLayer?.addOnFeatureClickListener(this)
// Apply default style to all features on load to enable clicking. styleDatasetsLayer() }
// Define the click event handler to set lastGlobalId to globalid of selected feature. override fun onFeatureClick(event: FeatureClickEvent) { // Get the dataset feature affected by the click. val clickFeatures: MutableList<Feature> = event.features lastGlobalId = null if (clickFeatures.get(0) is DatasetFeature) { lastGlobalId = ((clickFeatures.get(0) as DatasetFeature).getDatasetAttributes().get("globalid")) // Remember to reset the Style Factory. styleDatasetsLayer() } }Java
private FeatureLayer datasetLayer; // The globalid of the clicked dataset feature. String lastgobalid = null;
@Override public void onMapReady(GoogleMap map) {
// Get the DATASET feature layer. datasetLayer = map.getFeatureLayer(new FeatureLayerOptions.Builder() .featureType(FeatureType.DATASET) // Specify the dataset ID. .datasetId(YOUR_DATASET_ID) .build());
// Register the click event handler for the Datasets layer. datasetLayer.addOnFeatureClickListener(this);
// Apply default style to all features on load to enable clicking. styleDatasetsLayer(); }
@Override // Define the click event handler. public void onFeatureClick(FeatureClickEvent event) { // Get the dataset feature affected by the click. List<Feature> clickFeatures = event.getFeatures(); lastgobalid = null; if (clickFeatures.get(0) instanceof DatasetFeature) { lastgobalid = ((DatasetFeature) clickFeatures.get(0)).getDatasetAttributes().get("globalid"); // Remember to reset the Style Factory. styleDatasetsLayer(); } }Aplica un color de relleno azul al componente seleccionado y verde a todos los demás componentes. Solo se puede hacer clic en los componentes visibles.
Kotlin
// Set fill and border for all features. private fun styleDatasetsLayer() { // Create the style factory function. val styleFactory = FeatureLayer.StyleFactory { feature: Feature ->
// Check if the feature is an instance of DatasetFeature. if (feature is DatasetFeature) { val globalIDs: MutableMap<String, String> = feature.getDatasetAttributes() // Determine globalid attribute. val globalID = globalIDs!!["globalid"] // Set default colors to to green. var fillColor = 0x800000ff var strokeColor = 0xff0000ff if (globalID == lastGlobalId) { // Color selected area blue. fillColor = 0x8000ff00 strokeColor = 0xff00ff00 } return@StyleFactory FeatureStyle.Builder() .fillColor(fillColor) .strokeColor(strokeColor) .build() } return@StyleFactory null }
// Apply the style factory function to the dataset feature layer. datasetLayer?.setFeatureStyle(styleFactory) }Java
// Set default green fill and border for all features. private void styleDatasetsLayer() { // Create the style factory function. FeatureLayer.StyleFactory styleFactory = (Feature feature) -> {
// Check if the feature is an instance of DatasetFeature. if (feature instanceof DatasetFeature) {
// Check if "globalid" attribute of feature is the "globalid" of clicked feature. Map<String, String> globalIDs = ((DatasetFeature) feature).getDatasetAttributes(); String globalID = globalIDs.get("globalid"); // Set default colors to green. int fillColor = 0x4000ff00; int strokeColor = 0xff00ff00; if (Objects.equals(globalID, lastgobalid)) { // Color selected area blue. fillColor = 0x400000ff; strokeColor = 0xff0000ff; } return new FeatureStyle.Builder() .fillColor(fillColor) .strokeColor(strokeColor) .strokeWidth(2) .build(); } return null; };
// Apply the style factory function to the feature layer. datasetLayer.setFeatureStyle(styleFactory); }