edit
This commit is contained in:
@@ -195,7 +195,34 @@
|
|||||||
}
|
}
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
function calculateOptimalLocationSize() {
|
||||||
|
// 1. Получаем размеры видимой области
|
||||||
|
const width = window.innerWidth;
|
||||||
|
const height = window.innerHeight;
|
||||||
|
|
||||||
|
// 2. Получаем текущий размер шрифта (из состояния или напрямую из настроек)
|
||||||
|
// Если размер шрифта еще не задан, используем 18px по умолчанию
|
||||||
|
const fontSize = state.currentFontSize || 18;
|
||||||
|
|
||||||
|
// 3. Эмпирический коэффициент:
|
||||||
|
// На 1 квадратный пиксель при 18-м шрифте приходится примерно 0.005 - 0.007 символа.
|
||||||
|
// Мы рассчитываем "площадь" одного символа.
|
||||||
|
// Чем больше шрифт, тем больше места занимает символ (квадратичная зависимость).
|
||||||
|
const charArea = (fontSize * fontSize) * 0.55;
|
||||||
|
|
||||||
|
// 4. Рассчитываем общую вместимость экрана в символах
|
||||||
|
const screenArea = width * height;
|
||||||
|
let charactersPerScreen = Math.floor(screenArea / charArea);
|
||||||
|
|
||||||
|
// 5. Ограничиваем значения для стабильности epub.js
|
||||||
|
// Минимум 400 (чтобы не плодить тысячи локаций на маленьких текстах)
|
||||||
|
// Максимум 1500 (чтобы избежать "залипания" на больших экранах)
|
||||||
|
const finalSize = Math.max(400, Math.min(1500, charactersPerScreen));
|
||||||
|
|
||||||
|
debugLog(`Расчет локации: Экран ${width}x${height}, Шрифт ${fontSize}px => Размер локации: ${finalSize}`);
|
||||||
|
|
||||||
|
return finalSize;
|
||||||
|
}
|
||||||
// ========== MESSAGE BRIDGE (Связь с приложением) ==========
|
// ========== MESSAGE BRIDGE (Связь с приложением) ==========
|
||||||
function sendMessage(action, data) { // Отправка данных в нативный код (C# / Swift / Kotlin)
|
function sendMessage(action, data) { // Отправка данных в нативный код (C# / Swift / Kotlin)
|
||||||
const message = JSON.stringify({ action, data: data || {} });
|
const message = JSON.stringify({ action, data: data || {} });
|
||||||
@@ -299,8 +326,10 @@
|
|||||||
} else {
|
} else {
|
||||||
debugLog("Кэша нет, считаем в фоне...");
|
debugLog("Кэша нет, считаем в фоне...");
|
||||||
// Используем setTimeout, чтобы не блокировать поток отрисовки
|
// Используем setTimeout, чтобы не блокировать поток отрисовки
|
||||||
|
const dynamicSize = calculateOptimalLocationSize();
|
||||||
|
// Запускаем генерацию с динамическим размером
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
state.book.locations.generate(2000).then(() => {
|
state.book.locations.generate(dynamicSize).then(() => {
|
||||||
state.totalPages = state.book.locations.length();
|
state.totalPages = state.book.locations.length();
|
||||||
const locationsToSave = state.book.locations.save();
|
const locationsToSave = state.book.locations.save();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user