-
Notifications
You must be signed in to change notification settings - Fork 131
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add feature id to annotations; prepare showcase of callout annotations (
#994) * Add feature id to annotations; prepare showcase of callout annotations * Re-use id for annotation * Update example * Allow view annotation be draggable
- Loading branch information
Showing
6 changed files
with
161 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
139 changes: 139 additions & 0 deletions
139
...java/com/mapbox/maps/testapp/examples/markersandcallouts/AnnotationWithCalloutActivity.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,139 @@ | ||
package com.mapbox.maps.testapp.examples.markersandcallouts | ||
|
||
import android.annotation.SuppressLint | ||
import android.graphics.Bitmap | ||
import android.os.Bundle | ||
import android.view.View | ||
import android.widget.Button | ||
import androidx.appcompat.app.AppCompatActivity | ||
import com.mapbox.geojson.Point | ||
import com.mapbox.maps.MapView | ||
import com.mapbox.maps.Style | ||
import com.mapbox.maps.ViewAnnotationAnchor | ||
import com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor | ||
import com.mapbox.maps.plugin.annotation.Annotation | ||
import com.mapbox.maps.plugin.annotation.annotations | ||
import com.mapbox.maps.plugin.annotation.generated.* | ||
import com.mapbox.maps.testapp.R | ||
import com.mapbox.maps.testapp.databinding.ActivityViewAnnotationShowcaseBinding | ||
import com.mapbox.maps.testapp.databinding.ItemCalloutViewBinding | ||
import com.mapbox.maps.testapp.utils.BitmapUtils | ||
import com.mapbox.maps.viewannotation.viewAnnotationOptions | ||
|
||
/** | ||
* Example how to add view annotation to the point annotation. | ||
*/ | ||
class AnnotationWithCalloutActivity : AppCompatActivity() { | ||
|
||
private lateinit var pointAnnotationManager: PointAnnotationManager | ||
private lateinit var pointAnnotation: PointAnnotation | ||
private lateinit var viewAnnotation: View | ||
|
||
@SuppressLint("SetTextI18n") | ||
override fun onCreate(savedInstanceState: Bundle?) { | ||
super.onCreate(savedInstanceState) | ||
val binding = ActivityViewAnnotationShowcaseBinding.inflate(layoutInflater) | ||
setContentView(binding.root) | ||
|
||
val iconBitmap = BitmapUtils.bitmapFromDrawableRes( | ||
this@AnnotationWithCalloutActivity, | ||
R.drawable.blue_marker_view | ||
)!! | ||
|
||
binding.mapView.getMapboxMap().loadStyleUri(Style.MAPBOX_STREETS) { | ||
prepareAnnotationMarker(binding.mapView, iconBitmap) | ||
prepareViewAnnotation(binding.mapView) | ||
// show / hide view annotation based on a marker click | ||
pointAnnotationManager.addClickListener { clickedAnnotation -> | ||
if (pointAnnotation == clickedAnnotation) { | ||
viewAnnotation.toggleViewVisibility() | ||
} | ||
true | ||
} | ||
// show / hide view annotation based on marker visibility | ||
binding.fabStyleToggle.setOnClickListener { | ||
pointAnnotation.iconImageBitmap = if (pointAnnotation.iconImage == null) iconBitmap else null | ||
pointAnnotationManager.update(pointAnnotation) | ||
} | ||
// update view annotation geometry if dragging the marker | ||
pointAnnotationManager.addDragListener(object : OnPointAnnotationDragListener { | ||
override fun onAnnotationDragStarted(annotation: Annotation<*>) { | ||
} | ||
|
||
override fun onAnnotationDrag(annotation: Annotation<*>) { | ||
if (annotation == pointAnnotation) { | ||
binding.mapView.viewAnnotationManager.updateViewAnnotation( | ||
viewAnnotation, | ||
viewAnnotationOptions { | ||
geometry(pointAnnotation.geometry) | ||
} | ||
) | ||
ItemCalloutViewBinding.bind(viewAnnotation).apply { | ||
textNativeView.text = "lat=%.2f\nlon=%.2f".format( | ||
pointAnnotation.geometry.latitude(), | ||
pointAnnotation.geometry.longitude() | ||
) | ||
} | ||
} | ||
} | ||
|
||
override fun onAnnotationDragFinished(annotation: Annotation<*>) { | ||
} | ||
}) | ||
} | ||
} | ||
|
||
private fun View.toggleViewVisibility() { | ||
visibility = if (visibility == View.VISIBLE) View.GONE else View.VISIBLE | ||
} | ||
|
||
@SuppressLint("SetTextI18n") | ||
private fun prepareViewAnnotation(mapView: MapView) { | ||
val viewAnnotationManager = mapView.viewAnnotationManager | ||
viewAnnotation = viewAnnotationManager.addViewAnnotation( | ||
resId = R.layout.item_callout_view, | ||
options = viewAnnotationOptions { | ||
geometry(POINT) | ||
associatedFeatureId(pointAnnotation.featureIdentifier) | ||
anchor(ViewAnnotationAnchor.BOTTOM) | ||
offsetY((pointAnnotation.iconImageBitmap?.height!!).toInt()) | ||
} | ||
) | ||
ItemCalloutViewBinding.bind(viewAnnotation).apply { | ||
textNativeView.text = "lat=%.2f\nlon=%.2f".format(POINT.latitude(), POINT.longitude()) | ||
closeNativeView.setOnClickListener { | ||
viewAnnotationManager.removeViewAnnotation(viewAnnotation) | ||
} | ||
selectButton.setOnClickListener { b -> | ||
val button = b as Button | ||
val isSelected = button.text.toString().equals("SELECT", true) | ||
val pxDelta = if (isSelected) SELECTED_ADD_COEF_PX else -SELECTED_ADD_COEF_PX | ||
button.text = if (isSelected) "DESELECT" else "SELECT" | ||
viewAnnotationManager.updateViewAnnotation( | ||
viewAnnotation, | ||
viewAnnotationOptions { | ||
width(viewAnnotationManager.getViewAnnotationOptionsByView(viewAnnotation)?.width!! + pxDelta) | ||
height(viewAnnotationManager.getViewAnnotationOptionsByView(viewAnnotation)?.height!! + pxDelta) | ||
selected(isSelected) | ||
} | ||
) | ||
} | ||
} | ||
} | ||
|
||
private fun prepareAnnotationMarker(mapView: MapView, iconBitmap: Bitmap) { | ||
val annotationPlugin = mapView.annotations | ||
val pointAnnotationOptions: PointAnnotationOptions = PointAnnotationOptions() | ||
.withPoint(POINT) | ||
.withIconImage(iconBitmap) | ||
.withIconAnchor(IconAnchor.BOTTOM) | ||
.withDraggable(true) | ||
pointAnnotationManager = annotationPlugin.createPointAnnotationManager() | ||
pointAnnotation = pointAnnotationManager.create(pointAnnotationOptions) | ||
} | ||
|
||
private companion object { | ||
const val SELECTED_ADD_COEF_PX = 50 | ||
val POINT: Point = Point.fromLngLat(0.381457, 6.687337) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters