fix: 添加预设字体粗细控制

This commit is contained in:
HapeLee
2026-07-01 01:02:56 +08:00
parent 1397b0a334
commit b60c025473
5 changed files with 125 additions and 26 deletions
@@ -1,11 +1,16 @@
package io.legado.app.ui.book.read.sheet package io.legado.app.ui.book.read.sheet
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.FastOutSlowInEasing import androidx.compose.animation.core.FastOutSlowInEasing
import androidx.compose.animation.core.tween import androidx.compose.animation.core.tween
import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.gestures.Orientation
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
@@ -15,13 +20,12 @@ import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.FormatBold
import androidx.compose.material.icons.filled.FormatItalic import androidx.compose.material.icons.filled.FormatItalic
import androidx.compose.material.icons.filled.FormatUnderlined import androidx.compose.material.icons.filled.FormatUnderlined
import androidx.compose.material.icons.filled.Layers import androidx.compose.material.icons.filled.Layers
import androidx.compose.material.icons.filled.TextFields import androidx.compose.material.icons.filled.TextFields
import androidx.compose.material.icons.filled.TextFormat
import androidx.compose.material.icons.filled.Tune import androidx.compose.material.icons.filled.Tune
import androidx.compose.material3.Icon
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@@ -45,9 +49,12 @@ import io.legado.app.help.config.ReadBookConfig
import io.legado.app.ui.book.read.ConfigUpdate import io.legado.app.ui.book.read.ConfigUpdate
import io.legado.app.ui.book.read.ReadBookIntent import io.legado.app.ui.book.read.ReadBookIntent
import io.legado.app.ui.config.readConfig.ReadConfig import io.legado.app.ui.config.readConfig.ReadConfig
import io.legado.app.ui.theme.LegadoTheme
import io.legado.app.ui.widget.components.AppSlider
import io.legado.app.ui.widget.components.AppTextField import io.legado.app.ui.widget.components.AppTextField
import io.legado.app.ui.widget.components.SectionTitle import io.legado.app.ui.widget.components.SectionTitle
import io.legado.app.ui.widget.components.alert.AppAlertDialog import io.legado.app.ui.widget.components.alert.AppAlertDialog
import io.legado.app.ui.widget.components.card.NormalCard
import io.legado.app.ui.widget.components.dialog.ColorPickerSheet import io.legado.app.ui.widget.components.dialog.ColorPickerSheet
import io.legado.app.ui.widget.components.pager.rememberPagerFlingPassThroughConnection import io.legado.app.ui.widget.components.pager.rememberPagerFlingPassThroughConnection
import io.legado.app.ui.widget.components.settingItem.TinyClickableSettingItem import io.legado.app.ui.widget.components.settingItem.TinyClickableSettingItem
@@ -281,14 +288,11 @@ internal fun TextEffectsPage(
onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TextItalic(it))) onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TextItalic(it)))
}, },
) )
TinySliderSettingItem( FontWeightSetting(
title = stringResource(R.string.font_weight_text), value = textBold,
value = textBold.coerceAtLeast(100).toFloat(),
valueRange = 100f..900f,
imageVector = Icons.Default.FormatBold,
onValueChange = { value -> onValueChange = { value ->
textBold = value.toInt() textBold = value
onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TextBold(value.toInt()))) onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TextBold(value)))
}, },
) )
@@ -400,12 +404,6 @@ internal fun TitleSettingsPage(
var colorPickerId by remember { mutableIntStateOf(0) } var colorPickerId by remember { mutableIntStateOf(0) }
var colorPickerInitial by remember { mutableIntStateOf(0) } var colorPickerInitial by remember { mutableIntStateOf(0) }
val weightIconMap = mapOf(
0 to Icons.Default.TextFields,
1 to Icons.Default.TextFormat,
2 to Icons.Default.FormatBold,
)
Column( Column(
modifier = modifier modifier = modifier
.fillMaxWidth() .fillMaxWidth()
@@ -429,14 +427,11 @@ internal fun TitleSettingsPage(
Spacer(Modifier.height(8.dp)) Spacer(Modifier.height(8.dp))
TinySliderSettingItem( FontWeightSetting(
title = stringResource(R.string.font_weight_text), value = titleBold,
value = titleBold.coerceAtLeast(100).toFloat(),
valueRange = 100f..900f,
imageVector = weightIconMap[titleBold] ?: Icons.Default.FormatBold,
onValueChange = { value -> onValueChange = { value ->
titleBold = value.toInt() titleBold = value
onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TitleBold(value.toInt()))) onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TitleBold(value)))
}, },
) )
@@ -605,3 +600,107 @@ internal fun TitleSettingsPage(
}, },
) )
} }
@Composable
private fun FontWeightSetting(
value: Int,
onValueChange: (Int) -> Unit,
) {
var showVariableWeight by remember { mutableStateOf(false) }
var sliderValue by remember(value) {
mutableFloatStateOf(
when (value) {
2 -> 300f
0 -> 400f
1 -> 900f
else -> value.coerceIn(100, 900).toFloat()
}
)
}
val weightEntries = stringArrayResource(R.array.text_font_weight)
val presetValue = when (value) {
2 -> 2
1 -> 1
0 -> 0
in 100..350 -> 2
in 650..900 -> 1
else -> 0
}
Column {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(8.dp),
) {
Box(modifier = Modifier.weight(1f)) {
TinyDropdownSettingItem(
title = stringResource(R.string.font_weight_text),
selectedValue = presetValue.toString(),
displayEntries = arrayOf(
weightEntries[2],
weightEntries[0],
weightEntries[1],
),
entryValues = arrayOf("2", "0", "1"),
onValueChange = { onValueChange(it.toInt()) },
)
}
NormalCard(
onClick = { showVariableWeight = !showVariableWeight },
modifier = Modifier
.padding(bottom = 4.dp)
.height(56.dp)
.aspectRatio(1f),
containerColor = if (showVariableWeight) {
LegadoTheme.colorScheme.secondaryContainer
} else {
LegadoTheme.colorScheme.surfaceContainerLow
},
contentColor = if (showVariableWeight) {
LegadoTheme.colorScheme.onSecondaryContainer
} else {
LegadoTheme.colorScheme.onSurfaceVariant
},
cornerRadius = 12.dp,
) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center,
) {
Icon(
imageVector = Icons.Default.Tune,
contentDescription = stringResource(R.string.font_weight_text),
)
}
}
}
AnimatedVisibility(visible = showVariableWeight) {
NormalCard(
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 4.dp)
.height(56.dp),
containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
cornerRadius = 12.dp,
) {
Box(
modifier = Modifier
.fillMaxSize()
.padding(horizontal = 12.dp),
contentAlignment = Alignment.Center,
) {
AppSlider(
value = sliderValue,
onValueChange = { sliderValue = it },
onValueChangeFinished = {
onValueChange(sliderValue.toInt())
},
valueRange = 100f..900f,
modifier = Modifier.fillMaxWidth(),
)
}
}
}
}
}
+1 -1
View File
@@ -107,7 +107,7 @@
</string-array> </string-array>
<string-array name="text_font_weight"> <string-array name="text_font_weight">
<item></item> <item></item>
<item>粗体</item> <item>粗体</item>
<item>细体</item> <item>细体</item>
</string-array> </string-array>
+1 -1
View File
@@ -69,7 +69,7 @@
</string-array> </string-array>
<string-array name="text_font_weight"> <string-array name="text_font_weight">
<item></item> <item></item>
<item>粗體</item> <item>粗體</item>
<item>細體</item> <item>細體</item>
</string-array> </string-array>
+1 -1
View File
@@ -106,7 +106,7 @@
</string-array> </string-array>
<string-array name="text_font_weight"> <string-array name="text_font_weight">
<item></item> <item></item>
<item>粗體</item> <item>粗體</item>
<item>細體</item> <item>細體</item>
</string-array> </string-array>
+1 -1
View File
@@ -204,7 +204,7 @@
</string-array> </string-array>
<string-array name="text_font_weight"> <string-array name="text_font_weight">
<item>Normal</item> <item>Regular</item>
<item>Bold</item> <item>Bold</item>
<item>Light</item> <item>Light</item>
</string-array> </string-array>