Remote convert to png preload
This commit is contained in:
parent
087b09fe68
commit
7a8e70e693
|
@ -96,7 +96,6 @@ class MainActivity : FlutterActivity() {
|
||||||
// 获取可以迁移数据地址
|
// 获取可以迁移数据地址
|
||||||
"androidGetExtendDirs" -> androidGetExtendDirs()
|
"androidGetExtendDirs" -> androidGetExtendDirs()
|
||||||
"androidSecureFlag" -> androidSecureFlag(call.argument("flag")!!)
|
"androidSecureFlag" -> androidSecureFlag(call.argument("flag")!!)
|
||||||
"convertToPNG" -> convertToPNG(call.argument("path")!!)
|
|
||||||
else -> {
|
else -> {
|
||||||
notImplementedToken
|
notImplementedToken
|
||||||
}
|
}
|
||||||
|
@ -347,28 +346,6 @@ class MainActivity : FlutterActivity() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun convertToPNG(path: String): ByteArray {
|
|
||||||
BitmapFactory.decodeFile(path)?.let { bitmap ->
|
|
||||||
val maxWidth =
|
|
||||||
when {
|
|
||||||
Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> windowManager.currentWindowMetrics.bounds.width()
|
|
||||||
Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> {
|
|
||||||
val displayMetrics = DisplayMetrics()
|
|
||||||
windowManager.defaultDisplay.getRealMetrics(displayMetrics)
|
|
||||||
displayMetrics.widthPixels
|
|
||||||
}
|
|
||||||
else -> throw Exception("not support")
|
|
||||||
}
|
|
||||||
if (bitmap.width > maxWidth) {
|
|
||||||
val newHeight = maxWidth * bitmap.height / bitmap.width
|
|
||||||
val newImage = Bitmap.createScaledBitmap(bitmap, maxWidth, newHeight, true)
|
|
||||||
return compressBitMap(newImage)
|
|
||||||
}
|
|
||||||
return compressBitMap(bitmap)
|
|
||||||
}
|
|
||||||
throw Exception("error pic")
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun compressBitMap(bitmap: Bitmap): ByteArray {
|
private fun compressBitMap(bitmap: Bitmap): ByteArray {
|
||||||
val bos = ByteArrayOutputStream()
|
val bos = ByteArrayOutputStream()
|
||||||
bos.use { bos ->
|
bos.use { bos ->
|
||||||
|
|
|
@ -684,11 +684,6 @@ class Method {
|
||||||
return _flatInvoke("saveDownloadThreadCount", "$value");
|
return _flatInvoke("saveDownloadThreadCount", "$value");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 转化为PNG
|
|
||||||
Future<Uint8List> convertToPNG(String path) async {
|
|
||||||
return await _channel.invokeMethod("convertToPNG", {"path": path});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// HTTP-GET-STRING
|
/// HTTP-GET-STRING
|
||||||
Future<String> defaultHttpClientGet(String url) async {
|
Future<String> defaultHttpClientGet(String url) async {
|
||||||
return await _flatInvoke("defaultHttpClientGet", url);
|
return await _flatInvoke("defaultHttpClientGet", url);
|
||||||
|
|
|
@ -1,48 +0,0 @@
|
||||||
import 'dart:io';
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import '../Common.dart';
|
|
||||||
import '../Method.dart';
|
|
||||||
|
|
||||||
const _propertyName = "convertToPNG";
|
|
||||||
var _convertToPNG = false;
|
|
||||||
|
|
||||||
Future initConvertToPNG() async {
|
|
||||||
if (Platform.isAndroid) {
|
|
||||||
_convertToPNG =
|
|
||||||
(await method.loadProperty(_propertyName, "false")) == "true";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool convertToPNG() {
|
|
||||||
return _convertToPNG;
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _chooseConvertToPNGSetting(BuildContext context) async {
|
|
||||||
String? result = await chooseListDialog<String>(context, "超大图片缩放", ["是", "否"],
|
|
||||||
tips: "会增加耗电\n可以解决部分漫画崩溃的问题");
|
|
||||||
if (result != null) {
|
|
||||||
var target = result == "是";
|
|
||||||
await method.saveProperty(_propertyName, "$target");
|
|
||||||
_convertToPNG = target;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget convertToPNGSetting() {
|
|
||||||
if (Platform.isAndroid) {
|
|
||||||
return StatefulBuilder(
|
|
||||||
builder: (BuildContext context, void Function(void Function()) setState) {
|
|
||||||
return ListTile(
|
|
||||||
title: const Text("读取到超大图片时进行缩放(防止崩溃)"),
|
|
||||||
subtitle: Text(_convertToPNG ? "是" : "否"),
|
|
||||||
onTap: () async {
|
|
||||||
await _chooseConvertToPNGSetting(context);
|
|
||||||
setState(() {});
|
|
||||||
},
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return Container();
|
|
||||||
}
|
|
|
@ -6,7 +6,6 @@ import 'package:pikapika/basic/config/AutoClean.dart';
|
||||||
import 'package:pikapika/basic/config/AutoFullScreen.dart';
|
import 'package:pikapika/basic/config/AutoFullScreen.dart';
|
||||||
import 'package:pikapika/basic/config/ChooserRoot.dart';
|
import 'package:pikapika/basic/config/ChooserRoot.dart';
|
||||||
import 'package:pikapika/basic/config/ContentFailedReloadAction.dart';
|
import 'package:pikapika/basic/config/ContentFailedReloadAction.dart';
|
||||||
import 'package:pikapika/basic/config/ConvertToPNG.dart';
|
|
||||||
import 'package:pikapika/basic/config/DownloadAndExportPath.dart';
|
import 'package:pikapika/basic/config/DownloadAndExportPath.dart';
|
||||||
import 'package:pikapika/basic/config/DownloadThreadCount.dart';
|
import 'package:pikapika/basic/config/DownloadThreadCount.dart';
|
||||||
import 'package:pikapika/basic/config/FullScreenAction.dart';
|
import 'package:pikapika/basic/config/FullScreenAction.dart';
|
||||||
|
@ -80,7 +79,6 @@ class _InitScreenState extends State<InitScreen> {
|
||||||
await initDownloadAndExportPath();
|
await initDownloadAndExportPath();
|
||||||
await initAndroidSecureFlag();
|
await initAndroidSecureFlag();
|
||||||
await initDownloadThreadCount();
|
await initDownloadThreadCount();
|
||||||
await initConvertToPNG();
|
|
||||||
await initNoAnimation();
|
await initNoAnimation();
|
||||||
await initExportRename();
|
await initExportRename();
|
||||||
await initVersion();
|
await initVersion();
|
||||||
|
|
|
@ -8,7 +8,6 @@ import 'package:pikapika/basic/config/AutoClean.dart';
|
||||||
import 'package:pikapika/basic/config/AutoFullScreen.dart';
|
import 'package:pikapika/basic/config/AutoFullScreen.dart';
|
||||||
import 'package:pikapika/basic/config/ChooserRoot.dart';
|
import 'package:pikapika/basic/config/ChooserRoot.dart';
|
||||||
import 'package:pikapika/basic/config/ContentFailedReloadAction.dart';
|
import 'package:pikapika/basic/config/ContentFailedReloadAction.dart';
|
||||||
import 'package:pikapika/basic/config/ConvertToPNG.dart';
|
|
||||||
import 'package:pikapika/basic/config/DownloadAndExportPath.dart';
|
import 'package:pikapika/basic/config/DownloadAndExportPath.dart';
|
||||||
import 'package:pikapika/basic/config/DownloadThreadCount.dart';
|
import 'package:pikapika/basic/config/DownloadThreadCount.dart';
|
||||||
import 'package:pikapika/basic/config/ExportRename.dart';
|
import 'package:pikapika/basic/config/ExportRename.dart';
|
||||||
|
@ -66,7 +65,6 @@ class SettingsScreen extends StatelessWidget {
|
||||||
const NetworkSetting(),
|
const NetworkSetting(),
|
||||||
const Divider(),
|
const Divider(),
|
||||||
qualitySetting(),
|
qualitySetting(),
|
||||||
convertToPNGSetting(),
|
|
||||||
readerTypeSetting(),
|
readerTypeSetting(),
|
||||||
readerDirectionSetting(),
|
readerDirectionSetting(),
|
||||||
readerSliderPositionSetting(),
|
readerSliderPositionSetting(),
|
||||||
|
|
|
@ -6,20 +6,12 @@ import 'package:pikapika/basic/Common.dart';
|
||||||
import 'package:pikapika/basic/Cross.dart';
|
import 'package:pikapika/basic/Cross.dart';
|
||||||
import 'package:pikapika/basic/Method.dart';
|
import 'package:pikapika/basic/Method.dart';
|
||||||
import 'package:flutter_svg/svg.dart';
|
import 'package:flutter_svg/svg.dart';
|
||||||
import 'package:pikapika/basic/config/ConvertToPNG.dart';
|
|
||||||
import 'package:pikapika/basic/config/ImageAddress.dart';
|
import 'package:pikapika/basic/config/ImageAddress.dart';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'dart:ui' as ui show Codec;
|
import 'dart:ui' as ui show Codec;
|
||||||
|
|
||||||
import '../FilePhotoViewScreen.dart';
|
import '../FilePhotoViewScreen.dart';
|
||||||
|
|
||||||
Future<Uint8List> _loadImageFile(String path) {
|
|
||||||
if (convertToPNG()) {
|
|
||||||
return method.convertToPNG(path);
|
|
||||||
}
|
|
||||||
return File(path).readAsBytes();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 从本地加载图片
|
// 从本地加载图片
|
||||||
class ResourceFileImageProvider
|
class ResourceFileImageProvider
|
||||||
extends ImageProvider<ResourceFileImageProvider> {
|
extends ImageProvider<ResourceFileImageProvider> {
|
||||||
|
@ -46,7 +38,7 @@ class ResourceFileImageProvider
|
||||||
Future<ui.Codec> _loadAsync(ResourceFileImageProvider key) async {
|
Future<ui.Codec> _loadAsync(ResourceFileImageProvider key) async {
|
||||||
assert(key == this);
|
assert(key == this);
|
||||||
return PaintingBinding.instance!
|
return PaintingBinding.instance!
|
||||||
.instantiateImageCodec(await _loadImageFile(path));
|
.instantiateImageCodec(await File(path).readAsBytes());
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
Loading…
Reference in New Issue