下划线颜色、高度、虚线空隙比例设置

This commit is contained in:
HapeLee
2025-11-12 22:58:03 +08:00
parent 5fbdcf54d8
commit 4dcf097825
10 changed files with 242 additions and 32 deletions
@@ -38,6 +38,7 @@ import io.legado.app.ui.book.read.config.InfoConfigDialog
import io.legado.app.ui.book.read.config.PaddingConfigDialog
import io.legado.app.ui.book.read.config.PageKeyDialog
import io.legado.app.ui.book.read.config.ShadowSetDialog
import io.legado.app.ui.book.read.config.UnderlineConfigDialog
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.utils.ColorUtils
import io.legado.app.utils.FileDoc
@@ -150,6 +151,10 @@ abstract class BaseReadBookActivity :
showDialogFragment<FontSelectDialog>()
}
fun showUnderlineConfig() {
showDialogFragment<UnderlineConfigDialog>()
}
fun showBgTextConfig() {
showDialogFragment<BgTextConfigDialog>()
}
@@ -86,6 +86,7 @@ import io.legado.app.ui.book.read.config.TipConfigDialog.Companion.B_COLOR
import io.legado.app.ui.book.read.config.TipConfigDialog.Companion.TIP_COLOR
import io.legado.app.ui.book.read.config.TipConfigDialog.Companion.TIP_DIVIDER_COLOR
import io.legado.app.ui.book.read.config.ToolButtonConfigDialog
import io.legado.app.ui.book.read.config.UnderlineConfigDialog.Companion.U_COLOR
import io.legado.app.ui.book.read.page.ContentTextView
import io.legado.app.ui.book.read.page.ReadView
import io.legado.app.ui.book.read.page.entities.PageDirection
@@ -1572,6 +1573,12 @@ class ReadBookActivity : BaseReadBookActivity(),
setMenuCurAc(color)
postEvent(EventBus.UPDATE_READ_ACTION_BAR, true)
}
U_COLOR -> {
setUnderlineColor(color)
postEvent(EventBus.UP_CONFIG, arrayListOf(2))
postEvent(EventBus.UP_CONFIG, arrayListOf(6, 9, 11))
}
}
}
@@ -9,7 +9,6 @@ import io.legado.app.base.BaseBottomSheetDialogFragment
import io.legado.app.constant.EventBus
import io.legado.app.databinding.DialogFontConfigBinding
import io.legado.app.help.config.AppConfig
import io.legado.app.help.config.ReadBookConfig.dottedLine
import io.legado.app.help.config.ReadBookConfig.underline
import io.legado.app.lib.dialogs.alert
import io.legado.app.ui.book.read.ReadBookActivity
@@ -50,8 +49,6 @@ class FontConfigDialog : BaseBottomSheetDialogFragment(R.layout.dialog_font_conf
private fun initView() = binding.run {
binding.btnTextColor.color = ReadBookConfig.durConfig.curTextColor()
binding.swUnderline.isChecked = underline
binding.swDottedline.isChecked = dottedLine
binding.swDottedline.isEnabled = underline
dsbTextLetterSpacing.valueFormat = {
((it - 50) / 100f).toString()
}
@@ -136,18 +133,10 @@ class FontConfigDialog : BaseBottomSheetDialogFragment(R.layout.dialog_font_conf
}
binding.swUnderline.addOnCheckedChangeListener { _, isChecked ->
underline = isChecked
binding.swDottedline.isEnabled = isChecked
if (!isChecked) {
dottedLine = false
binding.swDottedline.isChecked = false
}
postEvent(EventBus.UP_CONFIG, arrayListOf(6, 9, 11))
}
binding.swDottedline.addOnCheckedChangeListener { _, isChecked ->
dottedLine = isChecked
postEvent(EventBus.UP_CONFIG, arrayListOf(6, 9, 11))
callBack2?.showUnderlineConfig()
dismissAllowingStateLoss()
}
binding.btnDefaultFonts.setOnClickListener {
val requireContext = requireContext()
alert(titleResource = R.string.system_typeface) {
@@ -0,0 +1,92 @@
package io.legado.app.ui.book.read.config
import android.os.Bundle
import android.view.View
import io.legado.app.help.config.ReadBookConfig
import com.jaredrummler.android.colorpicker.ColorPickerDialog
import io.legado.app.R
import io.legado.app.base.BaseBottomSheetDialogFragment
import io.legado.app.constant.EventBus
import io.legado.app.databinding.DialogUnderlineConfigBinding
import io.legado.app.help.config.ReadBookConfig.dottedLine
import io.legado.app.help.config.ReadBookConfig.underline
import io.legado.app.utils.observeEvent
import io.legado.app.utils.postEvent
import io.legado.app.utils.viewbindingdelegate.viewBinding
/**
* 字体选择对话框
*/
class UnderlineConfigDialog : BaseBottomSheetDialogFragment(R.layout.dialog_underline_config) {
companion object {
const val U_COLOR = 810
}
private val binding by viewBinding(DialogUnderlineConfigBinding::bind)
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
observeEvent<ArrayList<Int>>(EventBus.UP_CONFIG) { list ->
if (list.contains(2)) {
binding.btnUnderlineColor.color = ReadBookConfig.durConfig.curUnderlineColor()
}
}
initView()
}
private fun initView() = binding.run {
binding.btnUnderlineColor.color = ReadBookConfig.durConfig.curTextColor()
binding.swUnderline.isChecked = underline
binding.swDottedline.isChecked = dottedLine
binding.swDottedline.isEnabled = underline
binding.swUnderline.addOnCheckedChangeListener { _, isChecked ->
underline = isChecked
binding.swDottedline.isEnabled = isChecked
if (!isChecked) {
dottedLine = false
binding.swDottedline.isChecked = false
}
postEvent(EventBus.UP_CONFIG, arrayListOf(6, 9, 11))
}
binding.swDottedline.addOnCheckedChangeListener { _, isChecked ->
dottedLine = isChecked
postEvent(EventBus.UP_CONFIG, arrayListOf(6, 9, 11))
}
binding.btnDottedLineBlack.apply {
progress = ReadBookConfig.durConfig.dottedBase.toInt()
onChanged = {
ReadBookConfig.durConfig.dottedBase = it.toFloat()
postEvent(EventBus.UP_CONFIG, arrayListOf(6, 8, 10))
}
}
binding.btnDottedLineWhile.apply {
progress = ReadBookConfig.durConfig.dottedRatio.toInt()
onChanged = {
ReadBookConfig.durConfig.dottedRatio = it.toFloat()
postEvent(EventBus.UP_CONFIG, arrayListOf(6, 8, 10))
}
}
binding.btnUnderlineColor.setOnClickListener {
ColorPickerDialog.newBuilder()
.setColor(ReadBookConfig.durConfig.curUnderlineColor())
.setShowAlphaSlider(false)
.setDialogType(ColorPickerDialog.TYPE_CUSTOM)
.setDialogId(U_COLOR)
.show(requireActivity())
}
binding.btnUnderlineHeight.apply {
progress = ReadBookConfig.underlineHeight
onChanged = {
ReadBookConfig.underlineHeight = it
postEvent(EventBus.UP_CONFIG, arrayListOf(8, 9, 6))
}
}
}
}
@@ -211,16 +211,19 @@ data class TextLine(
*/
private fun drawUnderline(canvas: Canvas, dottedLine: Boolean) {
val paint = ChapterProvider.linePaint
paint.pathEffect =
if (dottedLine && !AppConfig.isEInkMode)
ChapterProvider.dashEffect
else
null
paint.color = ReadBookConfig.durConfig.curUnderlineColor()
paint.strokeWidth = ReadBookConfig.underlineHeight.toFloat()
paint.pathEffect = if (dottedLine && !AppConfig.isEInkMode)
ChapterProvider.dashEffect
else
null
val lineY = height - 1.dpToPx()
canvas.drawLine(lineStart + indentWidth, lineY, lineEnd, lineY, paint)
}
fun checkFastDraw(): Boolean {
if (!AppConfig.optimizeRender || exceed || !onlyTextColumn || textPage.isMsgPage) {
return false
@@ -66,7 +66,7 @@ object ChapterProvider {
}
}
val dashEffect = DashPathEffect(floatArrayOf(dottedBase, dottedRatio), 0f)
var dashEffect = DashPathEffect(floatArrayOf(dottedBase, dottedRatio), 0f)
@JvmStatic
var viewWidth = 0
@@ -877,6 +877,10 @@ object ChapterProvider {
// reviewPaint.textSize = contentPaint.textSize * 0.45f
// reviewPaint.textAlign = Paint.Align.CENTER
}
dashEffect = DashPathEffect(
floatArrayOf(ReadBookConfig.durConfig.dottedBase, ReadBookConfig.durConfig.dottedRatio),
0f
)
//间距
lineSpacingExtra = ReadBookConfig.lineSpacingExtra / 10f
titleLineSpacingExtra = ReadBookConfig.titleLineSpacingExtra / 10f