文字下划虚线 #164

This commit is contained in:
HapeLee
2025-11-01 16:33:45 +08:00
parent 7c151e1b86
commit de1ae6f9e4
6 changed files with 39 additions and 3 deletions
@@ -382,6 +382,12 @@ object ReadBookConfig {
config.underline = value config.underline = value
} }
var dottedLine: Boolean
get() = config.dottedLine
set(value) {
config.dottedLine = value
}
var paddingBottom: Int var paddingBottom: Int
get() = config.paddingBottom get() = config.paddingBottom
set(value) { set(value) {
@@ -600,6 +606,7 @@ object ReadBookConfig {
var titleSegFlag: String = "",//分段判断,碰到指定值时分段 var titleSegFlag: String = "",//分段判断,碰到指定值时分段
var paragraphIndent: String = "  ",//段落缩进 var paragraphIndent: String = "  ",//段落缩进
var underline: Boolean = false, //下划线 var underline: Boolean = false, //下划线
var dottedLine: Boolean = false, //虚线
var paddingBottom: Int = 6, var paddingBottom: Int = 6,
var paddingLeft: Int = 16, var paddingLeft: Int = 16,
var paddingRight: Int = 16, var paddingRight: Int = 16,
@@ -131,6 +131,8 @@ class BgTextConfigDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_bg
binding.tvName.text = name.ifBlank { "文字" } binding.tvName.text = name.ifBlank { "文字" }
binding.swDarkStatusIcon.isChecked = curStatusIconDark() binding.swDarkStatusIcon.isChecked = curStatusIconDark()
binding.swUnderline.isChecked = underline binding.swUnderline.isChecked = underline
binding.swDottedline.isChecked = dottedLine
binding.swDottedline.isEnabled = underline
binding.sbBgAlpha.value = ReadBookConfig.bgAlpha.toFloat() binding.sbBgAlpha.value = ReadBookConfig.bgAlpha.toFloat()
} }
@@ -169,6 +171,15 @@ class BgTextConfigDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_bg
} }
binding.swUnderline.setOnCheckedChangeListener { _, isChecked -> binding.swUnderline.setOnCheckedChangeListener { _, isChecked ->
underline = 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.setOnCheckedChangeListener { _, isChecked ->
dottedLine = isChecked
postEvent(EventBus.UP_CONFIG, arrayListOf(6, 9, 11)) postEvent(EventBus.UP_CONFIG, arrayListOf(6, 9, 11))
} }
binding.tvTextColor.setOnClickListener { binding.tvTextColor.setOnClickListener {
@@ -2,6 +2,7 @@ package io.legado.app.ui.book.read.page.entities
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.graphics.Canvas import android.graphics.Canvas
import android.graphics.DashPathEffect
import android.graphics.Paint.FontMetrics import android.graphics.Paint.FontMetrics
import android.os.Build import android.os.Build
import androidx.annotation.Keep import androidx.annotation.Keep
@@ -170,7 +171,7 @@ data class TextLine(
PaintPool.recycle(underlinePaint) PaintPool.recycle(underlinePaint)
} }
if (ReadBookConfig.underline && !isImage && ReadBook.book?.isImage != true) { if (ReadBookConfig.underline && !isImage && ReadBook.book?.isImage != true) {
drawUnderline(canvas) drawUnderline(canvas, ReadBookConfig.dottedLine)
} }
} }
@@ -213,17 +214,24 @@ data class TextLine(
/** /**
* 绘制下划线 * 绘制下划线
*/ */
private fun drawUnderline(canvas: Canvas) { private fun drawUnderline(canvas: Canvas, dottedLine: Boolean) {
val lineY = height - 1.dpToPx() val lineY = height - 1.dpToPx()
val paint = ChapterProvider.contentPaint
val oldEffect = paint.pathEffect
if (dottedLine) {
paint.pathEffect = DashPathEffect(floatArrayOf(6f, 6f), 0f)
}
canvas.drawLine( canvas.drawLine(
lineStart + indentWidth, lineStart + indentWidth,
lineY, lineY,
lineEnd, lineEnd,
lineY, lineY,
ChapterProvider.contentPaint paint
) )
paint.pathEffect = oldEffect
} }
fun checkFastDraw(): Boolean { fun checkFastDraw(): Boolean {
if (!AppConfig.optimizeRender || exceed || !onlyTextColumn || textPage.isMsgPage) { if (!AppConfig.optimizeRender || exceed || !onlyTextColumn || textPage.isMsgPage) {
return false return false
@@ -135,6 +135,14 @@
android:text="@string/text_underline" android:text="@string/text_underline"
tools:ignore="TouchTargetSizeCheck" /> tools:ignore="TouchTargetSizeCheck" />
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/sw_dottedline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="6dp"
android:text="@string/text_dottedline"
tools:ignore="TouchTargetSizeCheck" />
<com.google.android.material.button.MaterialButtonGroup <com.google.android.material.button.MaterialButtonGroup
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
+1
View File
@@ -1325,4 +1325,5 @@
<string name="sort_new_to_old">从新到旧</string> <string name="sort_new_to_old">从新到旧</string>
<string name="sort_name_asc">名称升序</string> <string name="sort_name_asc">名称升序</string>
<string name="sort_name_desc">名称降序</string> <string name="sort_name_desc">名称降序</string>
<string name="text_dottedline">文字下划虚线</string>
</resources> </resources>
+1
View File
@@ -1326,4 +1326,5 @@
<string name="sort_new_to_old">从新到旧</string> <string name="sort_new_to_old">从新到旧</string>
<string name="sort_name_asc">名称升序</string> <string name="sort_name_asc">名称升序</string>
<string name="sort_name_desc">名称降序</string> <string name="sort_name_desc">名称降序</string>
<string name="text_dottedline">文字下划虚线</string>
</resources> </resources>