Explorar o código

文字下划虚线 #164

HapeLee hai 1 ano
pai
achega
de1ae6f9e4

+ 7 - 0
app/src/main/java/io/legado/app/help/config/ReadBookConfig.kt

@@ -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,

+ 11 - 0
app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt

@@ -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 {

+ 11 - 3
app/src/main/java/io/legado/app/ui/book/read/page/entities/TextLine.kt

@@ -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

+ 8 - 0
app/src/main/res/layout/dialog_read_bg_text.xml

@@ -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 - 0
app/src/main/res/values-zh/strings.xml

@@ -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 - 0
app/src/main/res/values/strings.xml

@@ -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>