pile_nav_new/lib/pages/aim_point/aimPointer.dart

214 lines
7.3 KiB
Dart
Raw Normal View History

2024-08-27 18:08:05 +08:00
import 'package:cpnav/pages/real_data/realController.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:scence_map/controllers/controller.dart';
import 'package:scence_map/scence_map.dart';
import '../../service/pile/device_type.dart';
final RealController realcontroller = Get.put(RealController());
// 对点 瞄准器
class SightController extends GetxController {
final mapcontroller = Get.put(ScenceMapController());
var isNomal = true.obs;
//左下圆
var sightOffset = const Offset(3, 3).obs;
var sightOffsetInit = const Offset(0, 0).obs;
var sightInit = const Offset(0, 0).obs;
var lastSightOffset = const Offset(0, 0).obs; // 新增变量,用于存储上一次手指离开时的位置
var initDx = 0.0.obs;
var isFirst = true.obs;
var visualList = [].obs;
var plot = 2.0.obs;
var scale = 0.75.obs;
reset() {
sightOffset.value = const Offset(3, 3);
sightOffsetInit.value = const Offset(0, 0);
sightInit.value = const Offset(0, 0);
initDx.value = 0.0;
update();
}
}
class SightView extends GetView<SightController> {
const SightView({super.key});
@override
Widget build(BuildContext context) {
final size = MediaQuery.of(context).size;
MediaQueryData mediaQueryData =
MediaQueryData.fromView(WidgetsBinding.instance.window); //获取当前屏幕信息
final orientation = mediaQueryData.orientation; //获得设备方向
final deviceType = getDeviceType(context);
double rectWidth = size.height / 2;
if (!controller.isNomal.value) {
rectWidth = size.width;
} else {
if (orientation == Orientation.landscape) {
rectWidth = size.width / 2;
if (deviceType == DeviceType.mobile) {
rectWidth = size.height - 5;
}
} else {
rectWidth = size.height / 2;
if (deviceType == DeviceType.mobile) {
rectWidth = size.width - 5;
}
}
}
bool isDarkMode = Theme.of(context).brightness == Brightness.dark;
return Obx(() {
return Stack(
children: [
CustomPaint(
//绘制瞄准器
size: Size(rectWidth, rectWidth),
painter: DrawCicle(controller, realcontroller.centerX.value,
realcontroller.centerX.value, isDarkMode),
)
],
);
});
}
}
class DrawCicle extends CustomPainter {
final SightController controller;
final double tiltX;
final double tiltY;
final bool isDarkMode;
DrawCicle(this.controller, this.tiltX, this.tiltY, this.isDarkMode);
final _paint = Paint(); //创建一个画笔并配置其属性
Path path = Path();
List<IconData> icons = [
Icons.arrow_drop_up,
Icons.arrow_drop_down,
Icons.arrow_left,
Icons.arrow_right
];
List<Offset> iconOffset = [];
List<String> text = ["", "", "", ""]; //['前移', '后移', '左移', '右移'];
@override
void paint(Canvas canvas, size) {
_paint
..strokeWidth = 2
..style = PaintingStyle.stroke
..color = const Color.fromARGB(255, 183, 183, 162);
double rectWidth = (size.height / 2 - 5).roundToDouble();
if (!controller.isNomal.value) {
} else {}
path.moveTo(0, rectWidth + 5);
path.lineTo(size.height, rectWidth + 5);
path.moveTo(rectWidth + 5, 0);
path.lineTo(rectWidth + 5, size.height);
canvas.drawPath(path, _paint);
// 总长 2m
double step = (rectWidth / controller.plot.value / 10).roundToDouble();
canvas.translate(rectWidth + 5, rectWidth + 5);
for (var i = 0; i < 21; i++) {
if (i % 10 == 0) {
double line = 7;
canvas.drawLine(Offset(0, i * step), Offset(line, i * step), _paint);
canvas.drawLine(Offset(i * step, 0), Offset(i * step, line), _paint);
canvas.drawLine(Offset(0, -i * step), Offset(line, -i * step), _paint);
canvas.drawLine(Offset(-i * step, 0), Offset(-i * step, line), _paint);
drawText(canvas, Offset(line, i * step), i ~/ 10);
drawText(canvas, Offset(line, -i * step), (-i ~/ 10));
if (i ~/ 10 != 0) {
drawText(canvas, Offset(i * step, line), i ~/ 10);
drawText(canvas, Offset(-i * step, line), (-i ~/ 10));
}
} else if (i % 5 == 0) {
double line = 5;
canvas.drawLine(Offset(0, i * step), Offset(line, i * step), _paint);
canvas.drawLine(Offset(i * step, 0), Offset(i * step, line), _paint);
canvas.drawLine(Offset(0, -i * step), Offset(line, -i * step), _paint);
canvas.drawLine(Offset(-i * step, 0), Offset(-i * step, line), _paint);
} else {
double line = 3;
canvas.drawLine(Offset(0, i * step), Offset(line, i * step), _paint);
canvas.drawLine(Offset(i * step, 0), Offset(i * step, line), _paint);
canvas.drawLine(Offset(0, -i * step), Offset(line, -i * step), _paint);
canvas.drawLine(Offset(-i * step, 0), Offset(-i * step, line), _paint);
}
}
canvas.translate(-(rectWidth + 5), -(rectWidth + 5));
canvas.translate(rectWidth + 5, rectWidth + 5);
// if (controller.visualList.isNotEmpty) {
drawPoint(canvas, step);
// }
// 绘制水平仪
double x = realcontroller.tiltX.value; //
double y = realcontroller.tiltY.value; //
print(
"----${realcontroller.centerX.value},${realcontroller.centerY.value}");
if (realcontroller.tiltX.value == 0 || realcontroller.tiltY.value == 0) {
x = 0;
y = 0;
}
_paint.color = Colors.red;
canvas.drawCircle(Offset(x * step * 10, y * step * 10), 10, _paint);
canvas.translate(-(rectWidth + 5), -(rectWidth + 5));
}
drawText(Canvas canvas, Offset offset, int i, [bool isShow = true]) {
TextPainter textPainter = TextPainter(
text: TextSpan(
text: isShow ? "$i m" : "$i",
style: TextStyle(
fontSize: 12, color: isDarkMode ? Colors.white : Colors.black)),
textDirection: TextDirection.ltr,
textAlign: TextAlign.left);
textPainter.layout();
textPainter.paint(canvas, offset);
}
// drawPoint(Canvas canvas, double step) {
// // bug 绘制前应该旋转一定的角度
// // 设置当前施工点为中心,显示可视范围的点
// for (int i = 0; i < plumDataController.plumList.length; i++) {
// Offset item = plumDataController.plumList[i];
// double x = item.dx - realController.centerX.value;
// double y = item.dy - realController.centerY.value;
// // 纵向方向是相反
// Offset pos = Offset(x, y) * step * 10;
// canvas.drawCircle(pos, 20, Paint()..color = Colors.grey);
// drawText(canvas, pos - const Offset(20, 10), i, false);
// }
// }
drawPoint(Canvas canvas, double step) {
// bug 绘制前应该旋转一定的角度
// 设置当前施工点为中心,显示可视范围的点
for (int i = 0; i < plumDataController.plumList.length; i++) {
Offset item = plumDataController.plumList[i];
double x = item.dx - realcontroller.centerX.value;
double y = item.dy - realcontroller.centerY.value;
// 纵向方向是相反
Offset pos = Offset(x, y) * step * 10;
canvas.drawCircle(pos, 20, Paint()..color = Colors.grey);
drawText(canvas, pos - const Offset(20, 10), i, false);
}
}
@override
bool shouldRepaint(covariant CustomPainter oldDelegate) => true;
}