onTap method
Handle a tap on the AR view.
Implementation
Future<void> onTap(double x, double y) async {
final results = await arService.hitTest(x, y);
if (results.isEmpty) return;
// Use the most accurate hit result
final best = results.first;
switch (measureState.value) {
case ArMeasureState.scanning:
case ArMeasureState.placingFirst:
// Place first point
_firstPoint = best;
_firstMarkerId = await arService.addMarker(best, label: 'A');
measureState.value = ArMeasureState.placingSecond;
statusMessage.value = 'arTapSecondPoint'.tr;
case ArMeasureState.placingSecond:
// Place second point and calculate distance
final secondMarkerId = await arService.addMarker(best, label: 'B');
final measurement = ArMeasurement(
pointA: _firstPoint!.pose,
pointB: best.pose,
);
await arService.addDistanceLine(
_firstMarkerId!,
secondMarkerId,
measurement,
);
currentMeasurement.value = measurement;
measureService.addMeasurement(measurement);
measureState.value = ArMeasureState.measured;
statusMessage.value = measurement.formattedDistance;
case ArMeasureState.measured:
// Reset for next measurement
await arService.clearMarkers();
_firstPoint = null;
_firstMarkerId = null;
measureState.value = ArMeasureState.placingFirst;
statusMessage.value = 'arTapFirstPoint'.tr;
// Recurse to place the first point of the new measurement
await onTap(x, y);
default:
break;
}
}