From 8f84c6a6f97b2ac57bc8612f66fce02f8ad3b32d Mon Sep 17 00:00:00 2001 From: guozhigq Date: Sun, 20 Aug 2023 20:34:25 +0800 Subject: [PATCH] =?UTF-8?q?mod:=20=E5=9B=BE=E7=89=87=E9=A2=84=E8=A7=88?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/preview/controller.dart | 29 +++----- lib/pages/preview/view.dart | 115 +++++++++++++++++++----------- lib/utils/download.dart | 2 +- 3 files changed, 85 insertions(+), 61 deletions(-) diff --git a/lib/pages/preview/controller.dart b/lib/pages/preview/controller.dart index 8bc938f8..500f0b1d 100644 --- a/lib/pages/preview/controller.dart +++ b/lib/pages/preview/controller.dart @@ -2,11 +2,9 @@ import 'dart:io'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:get/get.dart'; -import 'dart:typed_data'; import 'package:dio/dio.dart'; import 'package:path_provider/path_provider.dart'; import 'package:permission_handler/permission_handler.dart'; -import 'package:image_gallery_saver/image_gallery_saver.dart'; import 'package:share_plus/share_plus.dart'; class PreviewController extends GetxController { @@ -17,7 +15,7 @@ class PreviewController extends GetxController { bool storage = true; bool videos = true; bool photos = true; - bool visiable = true; + String currentImgUrl = ''; @override void onInit() { @@ -26,6 +24,7 @@ class PreviewController extends GetxController { initialPage.value = Get.arguments['initialPage']!; currentPage.value = Get.arguments['initialPage']! + 1; imgList.value = Get.arguments['imgList']; + currentImgUrl = imgList[initialPage.value]; } } @@ -39,22 +38,6 @@ class PreviewController extends GetxController { // final photosInfo = statuses[Permission.photos].toString(); } - // 图片保存 - void onSaveImg() async { - var response = await Dio().get(imgList[initialPage.value], - options: Options(responseType: ResponseType.bytes)); - final result = await ImageGallerySaver.saveImage( - Uint8List.fromList(response.data), - quality: 100, - name: "pic_vvex${DateTime.now().toString().split('-').join()}"); - if (result != null) { - if (result['isSuccess']) { - // ignore: avoid_print - print('已保存到相册'); - } - } - } - // 图片分享 void onShareImg() async { requestPermission(); @@ -62,9 +45,15 @@ class PreviewController extends GetxController { options: Options(responseType: ResponseType.bytes)); final temp = await getTemporaryDirectory(); String imgName = - "pic_plpl${DateTime.now().toString().split('-').join()}.jpg"; + "plpl_pic_${DateTime.now().toString().split('-').join()}.jpg"; var path = '${temp.path}/$imgName'; File(path).writeAsBytesSync(response.data); Share.shareXFiles([XFile(path)], subject: imgList[initialPage.value]); } + + void onChange(int index) { + initialPage.value = index; + currentPage.value = index + 1; + currentImgUrl = imgList[index]; + } } diff --git a/lib/pages/preview/view.dart b/lib/pages/preview/view.dart index 610a3ae2..23d23dfb 100644 --- a/lib/pages/preview/view.dart +++ b/lib/pages/preview/view.dart @@ -2,9 +2,12 @@ import 'package:dismissible_page/dismissible_page.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:flutter/material.dart'; import 'package:extended_image/extended_image.dart'; +import 'package:pilipala/plugin/pl_player/index.dart'; +import 'package:pilipala/utils/download.dart'; import 'controller.dart'; typedef DoubleClickAnimationListener = void Function(); @@ -31,15 +34,69 @@ class _ImagePreviewState extends State super.initState(); // animationController = AnimationController( // vsync: this, duration: const Duration(milliseconds: 400)); + SystemChrome.setEnabledSystemUIMode( + SystemUiMode.immersiveSticky, + ); _doubleClickAnimationController = AnimationController( duration: const Duration(milliseconds: 250), vsync: this); } + onOpenMenu() { + SmartDialog.show( + useSystem: true, + animationType: SmartAnimationType.centerFade_otherSlide, + builder: (BuildContext context) { + return AlertDialog( + clipBehavior: Clip.hardEdge, + contentPadding: const EdgeInsets.fromLTRB(0, 12, 0, 12), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + onTap: () { + _previewController.onShareImg(); + SmartDialog.dismiss(); + }, + dense: true, + title: const Text('分享', style: TextStyle(fontSize: 14)), + ), + ListTile( + onTap: () { + Clipboard.setData( + ClipboardData(text: _previewController.currentImgUrl)) + .then((value) { + SmartDialog.showToast('已复制到粘贴板'); + SmartDialog.dismiss(); + }).catchError((err) { + SmartDialog.showNotify( + msg: err.toString(), + notifyType: NotifyType.error, + ); + }); + }, + dense: true, + title: const Text('复制链接', style: TextStyle(fontSize: 14)), + ), + ListTile( + onTap: () { + DownloadUtils.downloadImg(_previewController.currentImgUrl); + }, + dense: true, + title: const Text('保存到手机', style: TextStyle(fontSize: 14)), + ), + ], + ), + ); + }, + ); + } + @override void dispose() { // animationController.dispose(); _doubleClickAnimationController.dispose(); clearGestureDetailsCache(); + exitFullScreen(); super.dispose(); } @@ -69,19 +126,14 @@ class _ImagePreviewState extends State tag: _previewController .imgList[_previewController.initialPage.value], child: GestureDetector( - onTap: () { - _previewController.visiable = !_previewController.visiable; - setState(() {}); - }, + onLongPress: () => onOpenMenu(), child: ExtendedImageGesturePageView.builder( controller: ExtendedPageController( initialPage: _previewController.initialPage.value, pageSpacing: 0, ), - onPageChanged: (int index) { - _previewController.initialPage.value = index; - _previewController.currentPage.value = index + 1; - }, + onPageChanged: (int index) => + _previewController.onChange(index), canScrollPage: (GestureDetails? gestureDetails) => gestureDetails!.totalScale! <= 1.0, preloadPagesCount: 2, @@ -149,8 +201,10 @@ class _ImagePreviewState extends State children: [ SizedBox( width: 150.0, - child: - LinearProgressIndicator(value: progress), + child: LinearProgressIndicator( + value: progress, + color: Colors.white, + ), ), const SizedBox(height: 10.0), Text('${((progress ?? 0.0) * 100).toInt()}%'), @@ -179,7 +233,6 @@ class _ImagePreviewState extends State right: 0, bottom: 0, child: Container( - // height: 45, padding: EdgeInsets.only( bottom: MediaQuery.of(context).padding.bottom, top: 20), decoration: const BoxDecoration( @@ -193,36 +246,18 @@ class _ImagePreviewState extends State tileMode: TileMode.mirror, ), ), - child: Padding( - padding: const EdgeInsets.only(left: 20, right: 12), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Obx( - () => Text.rich( + child: Obx( + () => Text.rich( + textAlign: TextAlign.center, + TextSpan( + style: const TextStyle(color: Colors.white, fontSize: 15), + children: [ TextSpan( - style: const TextStyle( - color: Colors.white, fontSize: 18), - children: [ - TextSpan( - text: _previewController.currentPage - .toString()), - const TextSpan(text: ' / '), - TextSpan( - text: _previewController.imgList.length - .toString()), - ]), - ), - ), - const Spacer(), - ElevatedButton( - onPressed: () => _previewController.onShareImg(), - child: const Text('分享')), - const SizedBox(width: 10), - ElevatedButton( - onPressed: () => _previewController.onSaveImg(), - child: const Text('保存')) - ], + text: _previewController.currentPage.toString()), + const TextSpan(text: ' / '), + TextSpan( + text: _previewController.imgList.length.toString()), + ]), ), ), ), diff --git a/lib/utils/download.dart b/lib/utils/download.dart index 830464b2..ae89ef04 100644 --- a/lib/utils/download.dart +++ b/lib/utils/download.dart @@ -6,7 +6,7 @@ import 'package:image_gallery_saver/image_gallery_saver.dart'; import 'package:permission_handler/permission_handler.dart'; class DownloadUtils { - // 获取存储全县 + // 获取存储权限 static requestStoragePer() async { Map statuses = await [ Permission.storage,