From 610c9b1750a2c6e780508d4761218b14e082b0ae Mon Sep 17 00:00:00 2001 From: cxc Date: Wed, 6 Jul 2022 17:30:16 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BD=97=E7=9B=98=E5=8C=BA=E5=9F=9F=E5=88=92?= =?UTF-8?q?=E5=88=86=E4=B9=9D=E5=AE=AB=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/index.html | 2 +- lib/components/grid_clip_paint.dart | 43 ++++++++++ lib/pages/compass_page.dart | 121 +++++++++++++++++++++++----- lib/states/compass_image.dart | 45 +++++------ 4 files changed, 162 insertions(+), 49 deletions(-) create mode 100644 lib/components/grid_clip_paint.dart diff --git a/assets/index.html b/assets/index.html index 1e5d890..680dd59 100644 --- a/assets/index.html +++ b/assets/index.html @@ -77,7 +77,7 @@ var ml = res.lMonth; var dl = res.lDay; - var using_kook = (yearDz + timeDz + ml + dl + 2) % 9; + var using_kook = (yearDz + timeDz + ml + dl + 3) % 9; // 计算阴遁或阳遁 // 阴盘局数:(年地支序数+农历月+农历日+时地支序数) mod 9 diff --git a/lib/components/grid_clip_paint.dart b/lib/components/grid_clip_paint.dart new file mode 100644 index 0000000..474c588 --- /dev/null +++ b/lib/components/grid_clip_paint.dart @@ -0,0 +1,43 @@ +import 'dart:ui' as ui; + +import 'package:flutter/material.dart'; + +class GridClipPaint extends StatelessWidget { + const GridClipPaint({Key key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.transparent, + alignment: Alignment.center, + child: CustomPaint( + // 使用CustomPaint 背景画板 + painter: ClipPainter(), + ), + ); + } +} + +class ClipPainter extends CustomPainter { + ui.Image image; + + @override + void paint(Canvas canvas, Size size) { + // 创建画笔 + final Paint paint = Paint(); + canvas.drawImageRect( + image, + // Image(image: AssetImage("assets/images/arrow.png")), + Rect.fromLTRB(0, 0, 700 / 3, 700 / 3), + Rect.fromLTWH(0, 0, 700 / 3, 700 / 3), + paint); + // ..color = Colors.white + // ..strokeWidth = 2; + // 绘制线 + // canvas.drawLine(const Offset(-400, 0), const Offset(400, 0), paintLine); + // canvas.drawLine(const Offset(0, 500), const Offset(0, -440), paintLine); + } + + @override + bool shouldRepaint(CustomPainter oldDelegate) => false; +} diff --git a/lib/pages/compass_page.dart b/lib/pages/compass_page.dart index ac6eaf9..c5c9cc2 100644 --- a/lib/pages/compass_page.dart +++ b/lib/pages/compass_page.dart @@ -8,8 +8,8 @@ import 'package:fengshui_compass/pages/login_page.dart'; import 'package:fengshui_compass/states/region.dart'; import 'package:flutter/material.dart'; import 'package:flutter_serial_port_api/flutter_serial_port_api.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:image_picker/image_picker.dart'; -import 'package:path_provider/path_provider.dart'; import 'package:provider/provider.dart'; import 'package:stream_transform/stream_transform.dart'; @@ -296,9 +296,25 @@ class _CompassState extends State { }); } - void initCompassImage() async { - final directory = - await getApplicationDocumentsDirectory(); // AppData directory + double get radaw { + return (myaw + Provider.of(context).declination) * + 2 * + pi / + 360; + } + + double getCorrectionAngle(double angle) { + double result; + if (angle < 0) { + result = angle + 360; + } else if (angle >= 0 && angle < 180) { + result = angle + 180; + } else if (angle > 180) { + result = angle - 180; + } else { + result = 0.0; + } + return result; } @override @@ -358,14 +374,15 @@ class _CompassState extends State { child: Stack( children: [ Transform.rotate( - angle: (myaw + regionProvider.declination) * + angle: getCorrectionAngle((myaw + + regionProvider.declination)) * 2 * pi / 360, child: Image( width: 700, height: 700, - // alignment: Alignment.bottomLeft, + // alignment: Alignment.lerp(a, b, t), // image: compassImageProvider.rotateImage, image: compassImageProvider .rotateImage ?? @@ -381,6 +398,40 @@ class _CompassState extends State { ), ), CrossPaint(), + GridView.count( + crossAxisCount: 3, + children: List.generate( + 9, + (index) => Container( + decoration: BoxDecoration( + border: Border( + bottom: + const BorderSide(width: 1), + right: + const BorderSide(width: 1), + left: index % 3 == 0 + ? const BorderSide(width: 1) + : BorderSide.none, + top: index <= 2 + ? const BorderSide(width: 1) + : BorderSide.none), + color: const Color.fromRGBO( + 233, 233, 233, 0.3)), + height: 700 / 3, + width: 700 / 3, + child: GestureDetector( + child: Text('grid $index'), + onTap: () { + Fluttertoast.showToast( + msg: 'index: $index', + backgroundColor: Colors.green, + textColor: Colors.white, + fontSize: 20.0); + }, + ), + ), + ), + ) ], ), ), @@ -402,7 +453,13 @@ class _CompassState extends State { ), Text( // "${azimuth.toStringAsFixed(2)}", - (myaw + regionProvider.declination) + // ((myaw + regionProvider.declination) < 0 + // ? 360 + + // (myaw + regionProvider.declination) + // : (myaw + regionProvider.declination)) + // .toStringAsFixed(2), + getCorrectionAngle( + myaw + regionProvider.declination) .toStringAsFixed(2), style: const TextStyle( color: Colors.amber, fontSize: 36), @@ -412,27 +469,48 @@ class _CompassState extends State { //磁偏角调整按钮 Positioned( top: 5, - right: 8, + right: 6, child: IconButton( + tooltip: '选择城市', + iconSize: 30, onPressed: () => selectRegion(), icon: const Icon(Icons.settings, color: Colors.amber), )), Positioned( top: 5, - left: 8, - child: IconButton( - onPressed: () { - ImagePicker() - .pickImage(source: ImageSource.gallery) - .then((res) { - if (res == null) { - return; - } - - compassImageProvider.setSelectedRotateImage(res); - }); - }, + left: 6, + child: PopupMenuButton( + iconSize: 30, icon: const Icon(Icons.photo, color: Colors.amber), + itemBuilder: (BuildContext context) => [ + PopupMenuItem( + child: const ListTile( + leading: Icon(Icons.photo_album_rounded), + title: Text('选择新的罗盘图片'), + ), + onTap: () { + ImagePicker() + .pickImage(source: ImageSource.gallery) + .then((res) { + if (res == null) { + return; + } + compassImageProvider + .setSelectedRotateImage(res); + }); + }, + ), + PopupMenuItem( + enabled: compassImageProvider.rotateImage != null, + child: const ListTile( + leading: Icon(Icons.delete_rounded), + title: Text('恢复默认图片'), + ), + onTap: () { + compassImageProvider.resetRotateImage(); + }, + ), + ], )), // 最下面一行,ranging value openlaser Positioned( @@ -450,6 +528,7 @@ class _CompassState extends State { height: 90, bottom: 60, child: Image( + // alignment: , image: AssetImage("assets/images/range_input.png"), fit: BoxFit.contain, )), diff --git a/lib/states/compass_image.dart b/lib/states/compass_image.dart index ab96678..06e982e 100644 --- a/lib/states/compass_image.dart +++ b/lib/states/compass_image.dart @@ -16,19 +16,13 @@ class CompassImageProvider extends ChangeNotifier { ImageProvider get rotateImage => _rotateImage; -// 加载罗盘图片 + // 加载罗盘图片 void loadCompassImage() async { - final prefs = await _prefs; final appDataDirectory = await getApplicationDocumentsDirectory(); - String pathString = prefs.getString('rotate_image'); - if (pathString != null) { - File file = File(join(appDataDirectory.path, pathString)); - var isFileExist = await file.exists(); - if (isFileExist) { - _rotateImage = FileImage(file); - } else { - _rotateImage = null; - } + File file = File(join(appDataDirectory.path, 'rotate_image')); + bool isFileExist = await file.exists(); + if (isFileExist) { + _rotateImage = FileImage(file); } else { _rotateImage = null; } @@ -37,33 +31,30 @@ class CompassImageProvider extends ChangeNotifier { void setSelectedRotateImage(XFile res) async { final appDataDirectory = await getApplicationDocumentsDirectory(); - print(res.path); String pathString = res.name; if (pathString == null) { return; } - // imageCache.clear(); - // res.saveTo(join(appDataDirectory.path, res.name)); - res.saveTo( - join(appDataDirectory.path, 'rotate_image${extension(res.name)}')); - final prefs = await _prefs; - // final appDataDirectory = await getApplicationDocumentsDirectory(); - - // File file = File(join(appDataDirectory.path, pathString)); - // File file = - // File(join(appDataDirectory.path, 'rotate_image${extension(res.name)}')); + res.saveTo(join(appDataDirectory.path, 'rotate_image')); File file = File(res.path); - print(file); var isFileExist = await file.exists(); - print(isFileExist); if (isFileExist) { _rotateImage = FileImage(file); } else { _rotateImage = null; } - prefs.setString('rotate_image', 'rotate_image${extension(res.name)}'); - // prefs.setString('rotate_image', pathString); - // imageCache.clearLiveImages(); + notifyListeners(); + } + + // 将罗盘图片重置为默认 + void resetRotateImage() async { + final appDataDirectory = await getApplicationDocumentsDirectory(); + File file = File(join(appDataDirectory.path, 'rotate_image')); + bool isFileExist = await file.exists(); + if (isFileExist) { + file.delete(); + } + _rotateImage = null; notifyListeners(); } }