//字体 import 'package:bottom_picker/resources/arrays.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter/widgets.dart'; import 'package:get/get.dart'; import 'package:scence_map/controller.dart'; import 'package:scence_map/scence_map.dart'; import 'package:syncfusion_flutter_sliders/sliders.dart'; import 'iconContainer.dart'; import "controller.dart"; import "package:pass_track/pass_track.dart"; import "package:pass_track/pass_track_platform_interface.dart"; import "controller.dart"; import "dart:ffi" as ffi; // import '../login_in/connect/bluetooth_page.dart'; // import '../login_in/connect/config.dart'; // import '../login_in/connect/connect_type.dart'; // import '../login_in/getx/blue_tooth.dart'; // import '../setting/antenna_setting.dart'; // import '../setting/person_details.dart'; // import '../setting/wifi_page.dart'; // import '../setting/xy_change.dart'; ScenceMapController mapcontroller = Get.put(ScenceMapController()); class PassTrackView extends GetView { final GlobalKey> _popupMenuKey = GlobalKey>(); // final controller = Get.put(PassTrackController("WXLMB", "cp_road")); final String str = "播放"; // int sWidth = 800; // int sHeight = 800; // int bits = -1; // int speed = 50; // int maxLength = 200; // late SfRangeValues _rangevalues; final PassTrack _passTrackPlugin = PassTrack(); PassTrackView({Key? key}) : super(key: key); // @override // initState() { // super.initState(); // var maxLen = // controller.allLen > 0 ? controller.allLen : 1.0; // 确保 maxLen 大于 0 // _rangevalues = SfRangeValues(0.0, maxLen); // SchedulerBinding.instance.addPostFrameCallback((_) async { // sWidth = sqrt(screen.width * screen.width + screen.height * screen.height) // .ceil(); // // scenceMapController.scale = passTrackPlugin.passTrack_getScale() * 1.0; // fileHandle.date = widget.date; // await fileHandle.init(); // //在帧绘制完成后执行数据渲染 // // await initPlatformState(); // if (fileHandle.pointData.isNotEmpty) { // DecodeDataObj obj = fileHandle.pointData[0].obj!; // scenceMapController.centerXY = Offset(obj.y / 20, obj.x / 20); // } // for (var item in fileHandle.deviceList) { // if (item["point"] != null) { // bits = item["bits"]; // break; // } // } // // passTrackPlugin.map_setCenterDevice(bits); // setState(() { // if (fileHandle.pointData.isNotEmpty) { // maxLength = fileHandle.pointData.length; // // _value = maxLength; // _rangevalues = SfRangeValues(0.0, maxLength.toDouble()); // } // }); // }); // var f = initPlatformState(); // var future = controller.getHisFileList(_passTrackPlugin); // f.then((void _) { // _passTrackPlugin.setGridColor(const Color.fromARGB(255, 0, 0, 0).value); // _passTrackPlugin.drawGrid(); // future.then((value) { // _passTrackPlugin.setScale(1); // for (var TID in controller.deviceMap.keys) { // _passTrackPlugin.addDevice(int.parse(TID), 0); // } // for (var item in controller.coorTransMap.entries) { // print("tid:${item.key} value:${item.value}"); // } // // 统计用时 获取当前时间 // var start = DateTime.now().millisecondsSinceEpoch; // // _passTrackPlugin.generateTile(0, value); // _passTrackPlugin.waitForTile(() { // var start = DateTime.now().millisecondsSinceEpoch; // print("len: ${_passTrackPlugin.allTileCnt()}"); // _rangevalues = SfRangeValues(0, _passTrackPlugin.allTileCnt()); // _passTrackPlugin.playTrack( // 0, _passTrackPlugin.allTileCnt(), true, 0, ffi.nullptr); // var end = DateTime.now().millisecondsSinceEpoch; // print("play: ${end - start}"); // }); // // _passTrackPlugin.drawGrid(); // // 获取当前时间 // }); // }); // } // Future initPlatformState() async { // String platformVersion; // try { // platformVersion = await _passTrackPlugin.getPlatformVersion() ?? // 'Unknown platform version'; // } on Exception { // platformVersion = 'Failed to get platform version.'; // } // await _passTrackPlugin.create( // mapcontroller.height.toInt(), mapcontroller.width.toInt()); // fileHandle.textureId = await _passTrackPlugin.getTextureId() ?? -1; // print("textureId: ${fileHandle.textureId}"); // if (!mounted) Exception('Failed to get textureId.'); // setState(() { // platformVersion = platformVersion; // }); // return; // } @override Widget build(BuildContext context) { final size = MediaQuery.of(context).size; var isPortrait = MediaQuery.of(context).orientation == Orientation.portrait; var controller = this.controller; return OrientationBuilder(builder: (context, orientation) { return Stack( children: [ ScenceMapView( children: [ Positioned( top: mapcontroller.top, left: mapcontroller.left, child: SizedBox( width: mapcontroller.width, height: mapcontroller.height, // child: Text('Running on: $_platformVersion\n'), child: Texture(textureId: fileHandle.textureId))), ], onUpdate: (Offset center, double scale, double rotation) { print("center:$center scale:$scale rotation:$rotation"); }, ), Positioned( width: isPortrait ? size.width * .63 : size.width * .41, left: isPortrait ? 190 : 200, bottom: 30, child: Container( padding: const EdgeInsets.only(bottom: 5), child: SfRangeSlider( min: 0.0, // max: maxLength, max: controller.allLen > 0 ? controller.allLen : 1.0, // 确保 max 大于 0 values: _rangevalues, showTicks: false, showLabels: false, enableTooltip: true, minorTicksPerInterval: 1, stepSize: 1, onChanged: (SfRangeValues values) { // setState(() { // _rangevalues = SfRangeValues(values.start.roundToDouble(), // values.end.roundToDouble()); // }); }, ), ), ), Positioned( left: isPortrait ? 190 : 200, bottom: 0, child: Row( children: [ const SizedBox(width: 18), SizedBox( width: 74, child: ElevatedButton( style: ButtonStyle( backgroundColor: WidgetStateProperty.all( str == "播放" ? Colors.blue : Colors.red, ), ), onPressed: () { if (str == "播放") { _passTrackPlugin.playTrack( 0, 10000, true, 50, ffi.nullptr); } else { _passTrackPlugin.playPause(); } // setState(() { // str = str == "播放" ? "暂停" : "播放"; // }); }, child: Text( str, style: const TextStyle(fontSize: 12, color: Colors.black), ), ), ), const SizedBox(width: 5), GestureDetector( onTap: () { // 触发 PopupMenuButton 的点击事件 final dynamic state = _popupMenuKey.currentState; state.showButtonMenu(); }, child: Container( width: 70, height: 35, padding: const EdgeInsets.symmetric(horizontal: 6.0), decoration: BoxDecoration( color: const Color.fromARGB(255, 255, 255, 255), border: Border.all(color: Colors.black), ), child: Row( mainAxisSize: MainAxisSize.min, children: [ Obx( () => Text( "${controller.speed.value} X", style: const TextStyle( fontSize: 11, color: Colors.black), ), ), SizedBox( width: 25, child: PopupMenuButton( key: _popupMenuKey, padding: const EdgeInsets.all(1.0), icon: const Icon(Icons.arrow_drop_up, color: Color.fromARGB(255, 47, 48, 47)), onSelected: (int value) { controller.speed.value = value; }, // style: ButtonStyle( // minimumSize: MaterialStateProperty.all( // Size(48, 48)), // 设置最小点击区域 // tapTargetSize: MaterialTapTargetSize // .shrinkWrap, // 设置点击区域大小 // ), itemBuilder: (BuildContext context) { return speedList.map((int speed) { return PopupMenuItem( height: 30, value: speed, child: Obx(() => Text("${controller.speed.value} X速度")), ); }).toList(); }, ), ), ], )), ), const SizedBox(width: 12), Column( children: [ const Text("此处遍数:0"), StreamBuilder( stream: Stream.periodic( const Duration(seconds: 1), (_) => DateTime.now()), builder: (context, snapshot) { if (snapshot.hasData) { final dateTime = snapshot.data!.toLocal(); final formattedDate = "${dateTime.year % 100}-${dateTime.month.toString().padLeft(2, '0')}-${dateTime.day.toString().padLeft(2, '0')}"; final formattedTime = "${dateTime.hour.toString().padLeft(2, '0')}:${dateTime.minute.toString().padLeft(2, '0')}:${dateTime.second.toString().padLeft(2, '0')}"; return Text( "$formattedDate $formattedTime", style: const TextStyle( fontSize: 16, fontWeight: FontWeight.bold, ), ); } else { return const Text( "加载中...", style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold), ); } }, ), ], ), ], ), ), IconContainer() ], ); }); } }