diff --git a/assets/translation.json b/assets/translation.json index 1e6361f..4745018 100644 --- a/assets/translation.json +++ b/assets/translation.json @@ -332,7 +332,8 @@ "Created successfully": "创建成功", "name": "名称", "Reverse tap to turn Pages": "反转点击翻页", - "Show all": "显示全部" + "Show all": "显示全部", + "Number of images preloaded": "预加载图片数量" }, "zh_TW": { "Home": "首頁", @@ -667,6 +668,7 @@ "Created successfully": "創建成功", "name": "名稱", "Reverse tap to turn Pages": "反轉點擊翻頁", - "Show all": "顯示全部" + "Show all": "顯示全部", + "Number of images preloaded": "預加載圖片數量" } } \ No newline at end of file diff --git a/lib/foundation/appdata.dart b/lib/foundation/appdata.dart index 485e8cb..853bf1c 100644 --- a/lib/foundation/appdata.dart +++ b/lib/foundation/appdata.dart @@ -158,6 +158,7 @@ class _Settings with ChangeNotifier { 'sni': true, 'autoAddLanguageFilter': 'none', // none, chinese, english, japanese 'comicSourceListUrl': "https://cdn.jsdelivr.net/gh/venera-app/venera-configs@latest/index.json", + 'preloadImageCount': 4, }; operator [](String key) { diff --git a/lib/pages/reader/images.dart b/lib/pages/reader/images.dart index 4289053..7b8eee0 100644 --- a/lib/pages/reader/images.dart +++ b/lib/pages/reader/images.dart @@ -105,7 +105,7 @@ class _GalleryModeState extends State<_GalleryMode> late List cached; - int get preCacheCount => 4; + int get preCacheCount => appdata.settings["preloadImageCount"]; var photoViewControllers = {}; @@ -371,6 +371,9 @@ class _ContinuousModeState extends State<_ContinuousMode> var fingers = 0; bool disableScroll = false; + late List cached; + int get preCacheCount => appdata.settings["preloadImageCount"]; + /// Whether the user was scrolling the page. /// The gesture detector has a delay to detect tap event. /// To handle the tap event, we need to know if the user was scrolling before the delay. @@ -388,6 +391,11 @@ class _ContinuousModeState extends State<_ContinuousMode> reader = context.reader; reader._imageViewController = this; itemPositionsListener.itemPositions.addListener(onPositionChanged); + cached = List.filled(reader.maxPage + 2, false); + Future.delayed( + const Duration(milliseconds: 100), + () => cacheImages(reader.page), + ); super.initState(); } @@ -404,6 +412,7 @@ class _ContinuousModeState extends State<_ContinuousMode> reader.setPage(page); context.readerScaffold.update(); } + cacheImages(page); } double? futurePosition; @@ -443,6 +452,15 @@ class _ContinuousModeState extends State<_ContinuousMode> } } + void cacheImages(int current) { + for (int i = current + 1; i <= current + preCacheCount; i++) { + if (i <= reader.maxPage && !cached[i]) { + _precacheImage(i, context); + cached[i] = true; + } + } + } + @override Widget build(BuildContext context) { Widget widget = ScrollablePositionedList.builder( @@ -473,8 +491,6 @@ class _ContinuousModeState extends State<_ContinuousMode> width = double.infinity; } - _precacheImage(index, context); - ImageProvider image = _createImageProvider(index, context); return ComicImage( diff --git a/lib/pages/settings/reader.dart b/lib/pages/settings/reader.dart index 82b088c..7efb632 100644 --- a/lib/pages/settings/reader.dart +++ b/lib/pages/settings/reader.dart @@ -143,6 +143,13 @@ class _ReaderSettingsState extends State { callback: () => context.to(() => _CustomImageProcessing()), actionTitle: "Edit".tl, ).toSliver(), + _SliderSetting( + title: "Number of images preloaded".tl, + settingsIndex: "preloadImageCount", + interval: 1, + min: 1, + max: 16, + ).toSliver(), ], ); }