This page was machine-translated from Portuguese and may contain errors. The Portuguese version is canonical.
LocationPicker
LocationPicker picks a geographic coordinate on a map, with GPS tracking and a draggable pin. It follows the picker pattern (see Picker) and returns a LatLon.
🔴 · Package:
dev.crossfly.ui.picker· Extends:Picker· Hardware: GPS + map
When to use
- Collect a location (delivery address, point of interest) on a map.
Appearance
Top bar with circular buttons (map type Normal/Satellite, back, confirm), the map (FILL) filling the body, a draggable pin with an accuracy circle (green/red according to the PDOP) and a status label at the bottom.
Complete example (copy, paste and run)
LocationPicker opens a full-screen map — trigger it from a Button. The example reuses the basic usage and shows the confirmed coordinate in a Label. LatLon comes from dev.crossfly.map.
package com.exemplo;
import dev.crossfly.map.LatLon;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.picker.*;
/** Runnable main screen. Point the launcher (classname) and run: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new VerticalLayout());
Label saida = new Label("Nenhuma coordenada");
add(LAY_AUTO, saida);
Button escolher = new Button("Escolher local no mapa")
.onAction(c ->
{
LocationPicker lp = new LocationPicker(
coord -> {}, // onCapture from the constructor (optional; can be null)
10.0, // minPdop
true, // the pin can be dragged
true, // high precision
false); // no street view
lp.show(answer ->
{
LatLon ll = (LatLon) answer;
if (ll != null)
saida.setText("Local: " + ll.lat + ", " + ll.lon);
});
});
add(LAY_AUTO, escolher);
}
}
The snippets below show only the core (what goes inside
onShow()). To run them, place them in theMainWindowskeleton above.
Basic usage
LocationPicker lp = new LocationPicker(
coord -> Debug.log("Capturado: " + coord.lat + "," + coord.lon),
10.0, // minPdop
true, // the pin can be dragged
true, // high precision
false); // no street view
lp.show(answer ->
{
LatLon ll = (LatLon) answer;
salvarLocal(ll.lat, ll.lon);
});
Constructors
| Constructor | Description |
|---|---|
LocationPicker(RunnableWith<LatLon> onCapture, double minPdop, boolean canDragPin, boolean highPrecision, boolean streetview) |
See parameters below. |
| Parameter | Type | What it does |
|---|---|---|
onCapture |
RunnableWith<LatLon> |
Callback with the LatLon on confirmation (may be null). |
minPdop |
double |
Maximum acceptable PDOP; confirm stays hidden until it is reached. |
canDragPin |
boolean |
Allows dragging the pin to a manual location. |
highPrecision |
boolean |
Turns on high-precision GPS. |
streetview |
boolean |
Enables street view on the map. |
Callbacks and events
| Callback | When it fires |
|---|---|
onCapture (constructor) |
on confirmation, with the LatLon (if != null). |
show(onAnswer) |
on closing, delivers the confirmed LatLon. |
getAnswer() returns the confirmed LatLon, or null if canceled. There are two paths to the result (the constructor’s onCapture and the show’s onAnswer) — both only fire when answer != null.
States
- Dragging the pin turns off the GPS (
canUpdateGPS = false), marks “Custom Location” and reveals confirm. - The confirm button only appears when the accuracy is acceptable (or on desktop, or after a manual drag).
- Resources (GPS thread,
Location, map) are released exactly once on close.
Best practices
- Choose a realistic
minPdop; on mobile the confirm stays hidden until the GPS reaches it. - Do not reuse the instance after
hide()— the GPS/map resources are released.
Common mistakes
- Confirm never appearing — GPS did not reach
minPdopand the user did not drag the pin (on desktop it appears immediately). - Expecting
onAnsweron cancellation — it does not fire (answer = null).