阅读设置布局相关优化 #259

This commit is contained in:
HapeLee committed 2025-11-09 15:19:54 +08:00
1 parent cef9610f8f
commit e50d493146
21 files changed
+245 -452

No files matched your search

@@ -32,8 +32,12 @@ import io.legado.app.model.CacheBook
import io.legado.app.model.ReadBook import io.legado.app.model.ReadBook
import io.legado.app.ui.book.read.config.BgTextConfigDialog import io.legado.app.ui.book.read.config.BgTextConfigDialog
import io.legado.app.ui.book.read.config.ClickActionConfigDialog import io.legado.app.ui.book.read.config.ClickActionConfigDialog
import io.legado.app.ui.book.read.config.FontConfigDialog
import io.legado.app.ui.book.read.config.FontSelectDialog
import io.legado.app.ui.book.read.config.InfoConfigDialog 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.PageKeyDialog
import io.legado.app.ui.book.read.config.ShadowSetDialog
import io.legado.app.ui.file.HandleFileContract import io.legado.app.ui.file.HandleFileContract
import io.legado.app.utils.ColorUtils import io.legado.app.utils.ColorUtils
import io.legado.app.utils.FileDoc import io.legado.app.utils.FileDoc
@@ -126,10 +130,26 @@ abstract class BaseReadBookActivity :
} }
fun showPaddingConfig() { fun showInfoConfig() {
showDialogFragment<InfoConfigDialog>() showDialogFragment<InfoConfigDialog>()
} }
fun showFont() {
showDialogFragment<FontConfigDialog>()
}
fun showPaddingConfig() {
showDialogFragment<PaddingConfigDialog>()
}
fun showShadowSet() {
showDialogFragment<ShadowSetDialog>()
}
fun showFontSelect() {
showDialogFragment<FontSelectDialog>()
}
fun showBgTextConfig() { fun showBgTextConfig() {
showDialogFragment<BgTextConfigDialog>() showDialogFragment<BgTextConfigDialog>()
} }
@@ -75,8 +75,10 @@ import io.legado.app.ui.book.changesource.ChangeChapterSourceDialog
import io.legado.app.ui.book.info.BookInfoActivity import io.legado.app.ui.book.info.BookInfoActivity
import io.legado.app.ui.book.read.config.AutoReadDialog import io.legado.app.ui.book.read.config.AutoReadDialog
import io.legado.app.ui.book.read.config.BgTextConfigDialog.Companion.BG_COLOR import io.legado.app.ui.book.read.config.BgTextConfigDialog.Companion.BG_COLOR
import io.legado.app.ui.book.read.config.BgTextConfigDialog.Companion.TEXT_COLOR import io.legado.app.ui.book.read.config.FontConfigDialog
import io.legado.app.ui.book.read.config.FontSelectDialog.Companion.S_COLOR import io.legado.app.ui.book.read.config.FontConfigDialog.Companion.TEXT_COLOR
import io.legado.app.ui.book.read.config.FontConfigDialog.Companion.S_COLOR
import io.legado.app.ui.book.read.config.FontSelectDialog
import io.legado.app.ui.book.read.config.ReadAloudDialog import io.legado.app.ui.book.read.config.ReadAloudDialog
import io.legado.app.ui.book.read.config.ReadStyleDialog import io.legado.app.ui.book.read.config.ReadStyleDialog
import io.legado.app.ui.book.read.config.TipConfigDialog.Companion.A_COLOR import io.legado.app.ui.book.read.config.TipConfigDialog.Companion.A_COLOR
@@ -160,6 +162,8 @@ class ReadBookActivity : BaseReadBookActivity(),
ToolButtonConfigDialog.CallBack, ToolButtonConfigDialog.CallBack,
TxtTocRuleDialog.CallBack, TxtTocRuleDialog.CallBack,
ColorPickerDialogListener, ColorPickerDialogListener,
FontConfigDialog.CallBack,
FontSelectDialog.CallBack,
LayoutProgressListener { LayoutProgressListener {
private val tocActivity = private val tocActivity =
@@ -220,6 +224,19 @@ class ReadBookActivity : BaseReadBookActivity(),
private val popupAction: PopupAction by lazy { private val popupAction: PopupAction by lazy {
PopupAction(this) PopupAction(this)
} }
// 当前使用的字体路径(给 FontDialog 用)
override val curFontPath: String
get() = ReadBookConfig.textFont
// 当选择了字体时被调用
override fun selectFont(path: String) {
// path 为空表示恢复系统默认字体
ReadBookConfig.textFont = path
// 通知阅读界面刷新字体
postEvent(EventBus.UP_CONFIG, arrayListOf(8, 5))
}
override val isInitFinish: Boolean get() = viewModel.isInitFinish override val isInitFinish: Boolean get() = viewModel.isInitFinish
override val isScroll: Boolean get() = binding.readView.isScroll override val isScroll: Boolean get() = binding.readView.isScroll
private val isAutoPage get() = binding.readView.isAutoPage private val isAutoPage get() = binding.readView.isAutoPage
@@ -57,7 +57,6 @@ import java.io.FileOutputStream
class BgTextConfigDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_bg_text) { class BgTextConfigDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_bg_text) {
companion object { companion object {
const val TEXT_COLOR = 121
const val BG_COLOR = 122 const val BG_COLOR = 122
} }
@@ -5,29 +5,23 @@ import android.graphics.Typeface
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import io.legado.app.help.config.ReadBookConfig
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.documentfile.provider.DocumentFile import androidx.documentfile.provider.DocumentFile
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import com.jaredrummler.android.colorpicker.ColorPickerDialog
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.BaseBottomSheetDialogFragment import io.legado.app.base.BaseBottomSheetDialogFragment
import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.base.adapter.RecyclerAdapter
import io.legado.app.constant.AppLog import io.legado.app.constant.AppLog
import io.legado.app.constant.EventBus
import io.legado.app.constant.PreferKey import io.legado.app.constant.PreferKey
import io.legado.app.databinding.DialogFontSelectBinding import io.legado.app.databinding.DialogFontSelectBinding
import io.legado.app.databinding.ItemFontBinding import io.legado.app.databinding.ItemFontBinding
import io.legado.app.help.config.AppConfig 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.SelectItem import io.legado.app.lib.dialogs.SelectItem
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.permission.Permissions import io.legado.app.lib.permission.Permissions
import io.legado.app.lib.permission.PermissionsCompat import io.legado.app.lib.permission.PermissionsCompat
import io.legado.app.ui.book.read.config.BgTextConfigDialog.Companion.TEXT_COLOR
import io.legado.app.ui.file.HandleFileContract import io.legado.app.ui.file.HandleFileContract
import io.legado.app.utils.FileDoc import io.legado.app.utils.FileDoc
import io.legado.app.utils.FileUtils import io.legado.app.utils.FileUtils
@@ -39,8 +33,6 @@ import io.legado.app.utils.invisible
import io.legado.app.utils.isContentScheme import io.legado.app.utils.isContentScheme
import io.legado.app.utils.list import io.legado.app.utils.list
import io.legado.app.utils.listFileDocs import io.legado.app.utils.listFileDocs
import io.legado.app.utils.observeEvent
import io.legado.app.utils.postEvent
import io.legado.app.utils.printOnDebug import io.legado.app.utils.printOnDebug
import io.legado.app.utils.putPrefString import io.legado.app.utils.putPrefString
import io.legado.app.utils.toastOnUi import io.legado.app.utils.toastOnUi
@@ -50,20 +42,15 @@ import kotlinx.coroutines.launch
import java.io.File import java.io.File
import java.net.URLDecoder import java.net.URLDecoder
/**
* 字体选择对话框
*/
class FontSelectDialog : BaseBottomSheetDialogFragment(R.layout.dialog_font_select) { class FontSelectDialog : BaseBottomSheetDialogFragment(R.layout.dialog_font_select) {
companion object {
const val S_COLOR = 123
}
private val fontRegex = Regex("(?i).*\\.[ot]tf") private val fontRegex = Regex("(?i).*\\.[ot]tf")
private val binding by viewBinding(DialogFontSelectBinding::bind) private val binding by viewBinding(DialogFontSelectBinding::bind)
private val adapter by lazy { private val adapter by lazy {
val curFontPath = callBack?.curFontPath ?: "" val curFontPath = callBack?.curFontPath ?: ""
FontAdapter(requireContext(), curFontPath) FontAdapter(requireContext(), curFontPath)
} }
private val selectFontDir = registerForActivityResult(HandleFileContract()) { private val selectFontDir = registerForActivityResult(HandleFileContract()) {
it.uri?.let { uri -> it.uri?.let { uri ->
if (uri.isContentScheme()) { if (uri.isContentScheme()) {
@@ -86,22 +73,12 @@ class FontSelectDialog : BaseBottomSheetDialogFragment(R.layout.dialog_font_sele
} }
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
//binding.toolBar.setBackgroundColor(primaryColor)
binding.recyclerView.layoutManager = GridLayoutManager(context, 2) binding.recyclerView.layoutManager = GridLayoutManager(context, 2)
binding.recyclerView.adapter = adapter binding.recyclerView.adapter = adapter
observeEvent<ArrayList<Int>>(EventBus.UP_CONFIG) { list ->
if (list.contains(2)) {
binding.btnTextColor.color = ReadBookConfig.durConfig.curTextColor()
binding.btnShadowColor.color = ReadBookConfig.durConfig.curTextShadowColor()
}
}
initView() initView()
upView()
initViewEvent()
} }
private fun initView() = binding.run { private fun initView() {
val fontPath = getPrefString(PreferKey.fontFolder) val fontPath = getPrefString(PreferKey.fontFolder)
if (fontPath.isNullOrEmpty()) { if (fontPath.isNullOrEmpty()) {
openFolder() openFolder()
@@ -117,159 +94,10 @@ class FontSelectDialog : BaseBottomSheetDialogFragment(R.layout.dialog_font_sele
loadFontFilesByPermission(fontPath) loadFontFilesByPermission(fontPath)
} }
} }
binding.btnTextColor.color = ReadBookConfig.durConfig.curTextColor()
binding.swUnderline.isChecked = underline
binding.swDottedline.isChecked = dottedLine
binding.swDottedline.isEnabled = underline
dsbTextLetterSpacing.valueFormat = {
((it - 50) / 100f).toString()
}
dsbLineSize.valueFormat = { ((it - 10) / 10f).toString() }
binding.dsbShadowRadius.valueFormat = { "$it px" }
binding.dsbShadowDx.valueFormat = { "$it px" }
binding.dsbShadowDy.valueFormat = { "$it px" }
binding.dsbParagraphSpacing.valueFormat = { value ->
(value / 10f).toString()
}
binding.btnIndentLayout.apply {
valueFormat = { value ->
value.toString()
}
onChanged = { value ->
val indentCount = value.coerceIn(0, 4)
ReadBookConfig.paragraphIndent = " ".repeat(indentCount)
postEvent(EventBus.UP_CONFIG, arrayListOf(8, 5))
}
progress = ReadBookConfig.paragraphIndent.length
}
val weightOptions = context?.resources?.getStringArray(R.array.text_font_weight)
val weightValues = listOf(0, 1, 2)
val initialIndex = weightValues.indexOf(ReadBookConfig.textBold)
binding.textFontWeightConverter.text = weightOptions?.getOrNull(initialIndex) ?: "自定义"
binding.textFontWeightConverter.setOnClickListener {
context?.alert(titleResource = R.string.text_font_weight_converter) {
weightOptions?.let { options ->
items(options.toList()) { _, i ->
ReadBookConfig.textBold = weightValues[i]
binding.sliderFontWeight.value =
ReadBookConfig.textBold.toFloat().coerceAtLeast(100f)
binding.textFontWeightConverter.text = options.getOrNull(i) ?: ""
postEvent(EventBus.UP_CONFIG, arrayListOf(8, 9, 6))
}
}
}
}
binding.sliderFontWeight.apply {
valueFrom = 100f
valueTo = 900f
stepSize = 1f
value = ReadBookConfig.textBold.toFloat().coerceAtLeast(100f)
addOnChangeListener { _, newValue, _ ->
binding.textFontWeightConverter.text = "自定义"
ReadBookConfig.textBold = newValue.toInt()
postEvent(EventBus.UP_CONFIG, arrayListOf(8, 9, 6))
}
}
binding.btnTextItalic.isChecked = ReadBookConfig.textItalic
binding.btnTextShadow.isChecked = ReadBookConfig.textShadow
binding.btnShadowColor.color = ReadBookConfig.textShadowColor
}
private fun initViewEvent() = binding.run {
dsbTextLetterSpacing.onChanged = {
ReadBookConfig.letterSpacing = (it - 50) / 100f
postEvent(EventBus.UP_CONFIG, arrayListOf(8, 5))
}
dsbLineSize.onChanged = {
ReadBookConfig.lineSpacingExtra = it
postEvent(EventBus.UP_CONFIG, arrayListOf(8, 5))
}
binding.btnTextColor.setOnClickListener {
ColorPickerDialog.newBuilder()
.setColor(ReadBookConfig.durConfig.curTextColor())
.setShowAlphaSlider(false)
.setDialogType(ColorPickerDialog.TYPE_CUSTOM)
.setDialogId(TEXT_COLOR)
.show(requireActivity())
}
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.btnDefaultFonts.setOnClickListener {
val requireContext = requireContext()
alert(titleResource = R.string.system_typeface) {
items(
requireContext.resources.getStringArray(R.array.system_typefaces).toList()
) { _, i ->
AppConfig.systemTypefaces = i
onDefaultFontChange()
dismissAllowingStateLoss()
}
}
}
binding.btnOtherDir.setOnClickListener { binding.btnOtherDir.setOnClickListener {
openFolder() openFolder()
} }
binding.dsbParagraphSpacing.onChanged = { value ->
ReadBookConfig.paragraphSpacing = value
postEvent(EventBus.UP_CONFIG, arrayListOf(8, 5))
}
binding.btnTextItalic.addOnCheckedChangeListener { _, isChecked ->
ReadBookConfig.textItalic = isChecked
postEvent(EventBus.UP_CONFIG, arrayListOf(8, 5))
}
binding.btnTextShadow.addOnCheckedChangeListener { _, isChecked ->
ReadBookConfig.textShadow = isChecked
postEvent(EventBus.UP_CONFIG, arrayListOf(8, 5))
}
binding.dsbShadowRadius.onChanged = {
ReadBookConfig.shadowRadius = it.toFloat()
postEvent(EventBus.UP_CONFIG, arrayListOf(8, 5))
}
binding.dsbShadowDx.onChanged = {
ReadBookConfig.shadowDx = it.toFloat()
postEvent(EventBus.UP_CONFIG, arrayListOf(8, 5))
}
binding.dsbShadowDy.onChanged = {
ReadBookConfig.shadowDy = it.toFloat()
postEvent(EventBus.UP_CONFIG, arrayListOf(8, 5))
}
binding.btnShadowColor.setOnClickListener {
ColorPickerDialog.newBuilder()
.setColor(ReadBookConfig.config.curTextShadowColor())
.setShowAlphaSlider(false)
.setDialogType(ColorPickerDialog.TYPE_CUSTOM)
.setDialogId(S_COLOR)
.show(requireActivity())
//postEvent(EventBus.UP_CONFIG, arrayListOf(8, 5))
}
}
private fun upView() = binding.run {
ReadBookConfig.let {
dsbTextLetterSpacing.progress = (it.letterSpacing * 100).toInt() + 50
dsbLineSize.progress = it.lineSpacingExtra
dsbParagraphSpacing.progress = it.paragraphSpacing
binding.dsbShadowRadius.progress = it.shadowRadius.toInt()
binding.dsbShadowDx.progress = it.shadowDx.toInt()
binding.dsbShadowDy.progress = it.shadowDy.toInt()
}
} }
private fun openFolder() { private fun openFolder() {
@@ -10,6 +10,7 @@ import io.legado.app.databinding.DialogReadInfoBinding
import io.legado.app.help.config.ReadBookConfig import io.legado.app.help.config.ReadBookConfig
import io.legado.app.help.config.ReadTipConfig import io.legado.app.help.config.ReadTipConfig
import io.legado.app.lib.dialogs.selector import io.legado.app.lib.dialogs.selector
import io.legado.app.ui.book.read.ReadBookActivity
import io.legado.app.ui.book.read.config.TipConfigDialog.Companion.TIP_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.TipConfigDialog.Companion.TIP_DIVIDER_COLOR
import io.legado.app.utils.getCompatColor import io.legado.app.utils.getCompatColor
@@ -21,6 +22,7 @@ import io.legado.app.utils.viewbindingdelegate.viewBinding
class InfoConfigDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_info) { class InfoConfigDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_info) {
private val binding by viewBinding(DialogReadInfoBinding::bind) private val binding by viewBinding(DialogReadInfoBinding::bind)
private val callBack get() = activity as? ReadBookActivity
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
initView() initView()
@@ -55,7 +57,8 @@ class InfoConfigDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_info
} }
} }
binding.btnPaddingSetting.setOnClickListener { binding.btnPaddingSetting.setOnClickListener {
showDialogFragment<PaddingConfigDialog>() dismissAllowingStateLoss()
callBack?.showPaddingConfig()
} }
upTvTipColor() upTvTipColor()
upTvTipDividerColor() upTvTipDividerColor()
@@ -27,7 +27,7 @@ import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.viewbindingdelegate.viewBinding
class ReadStyleDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_book_style), class ReadStyleDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_book_style),
FontSelectDialog.CallBack { FontConfigDialog.CallBack {
sealed class ReadStyleItem { sealed class ReadStyleItem {
data class ConfigItem(val config: ReadBookConfig.Config) : ReadStyleItem() data class ConfigItem(val config: ReadBookConfig.Config) : ReadStyleItem()
@@ -66,10 +66,11 @@ class ReadStyleDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_book_
styleAdapter.addFooterView { styleAdapter.addFooterView {
ItemReadStyleBinding.inflate(layoutInflater, it, false).apply { ItemReadStyleBinding.inflate(layoutInflater, it, false).apply {
tvStyle.text = "" tvStyle.text = ""
cdStyle.cardElevation = 2f.dpToPx() cdStyle.cardElevation = 0f
cdStyle.radius = 32f.dpToPx() cdStyle.radius = 8f.dpToPx()
cdStyle.strokeWidth = 0 cdStyle.strokeWidth = 1.dpToPx()
ivStyle.setImageResource(R.drawable.ic_add) ivStyle.setImageResource(R.drawable.ic_add)
ivStyle.setPadding(12.dpToPx(),12.dpToPx(),12.dpToPx(),12.dpToPx())
root.setOnClickListener { root.setOnClickListener {
ReadBookConfig.configList.add(ReadBookConfig.Config()) ReadBookConfig.configList.add(ReadBookConfig.Config())
showBgTextConfig(ReadBookConfig.configList.lastIndex) showBgTextConfig(ReadBookConfig.configList.lastIndex)
@@ -100,11 +101,13 @@ class ReadStyleDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_book_
} }
tvTextFont.setOnClickListener { tvTextFont.setOnClickListener {
showDialogFragment<FontSelectDialog>() dismissAllowingStateLoss()
callBack?.showFont()
} }
tvPadding.setOnClickListener { tvPadding.setOnClickListener {
dismissAllowingStateLoss() dismissAllowingStateLoss()
callBack?.showPaddingConfig() callBack?.showInfoConfig()
} }
tvTip.setOnClickListener { tvTip.setOnClickListener {
TipConfigDialog().show(childFragmentManager, "tipConfigDialog") TipConfigDialog().show(childFragmentManager, "tipConfigDialog")
@@ -0,0 +1,66 @@
package io.legado.app.ui.book.read.config
import android.os.Bundle
import android.view.View
import io.legado.app.help.config.ReadBookConfig
import io.legado.app.R
import io.legado.app.base.BaseBottomSheetDialogFragment
import io.legado.app.constant.EventBus
import io.legado.app.databinding.DialogShadowSetBinding
import io.legado.app.utils.postEvent
import io.legado.app.utils.viewbindingdelegate.viewBinding
/**
* 字体选择对话框
*/
class ShadowSetDialog : BaseBottomSheetDialogFragment(R.layout.dialog_shadow_set) {
companion object {
const val S_COLOR = 123
}
private val fontRegex = Regex("(?i).*\\.[ot]tf")
private val binding by viewBinding(DialogShadowSetBinding::bind)
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
initView()
upView()
initViewEvent()
}
private fun initView() = binding.run {
binding.dsbShadowRadius.valueFormat = { "$it px" }
binding.dsbShadowDx.valueFormat = { "$it px" }
binding.dsbShadowDy.valueFormat = { "$it px" }
}
private fun initViewEvent() = binding.run {
binding.dsbShadowRadius.onChanged = {
ReadBookConfig.shadowRadius = it.toFloat()
postEvent(EventBus.UP_CONFIG, arrayListOf(8, 5))
}
binding.dsbShadowDx.onChanged = {
ReadBookConfig.shadowDx = it.toFloat()
postEvent(EventBus.UP_CONFIG, arrayListOf(8, 5))
}
binding.dsbShadowDy.onChanged = {
ReadBookConfig.shadowDy = it.toFloat()
postEvent(EventBus.UP_CONFIG, arrayListOf(8, 5))
}
}
private fun upView() = binding.run {
ReadBookConfig.let {
binding.dsbShadowRadius.progress = it.shadowRadius.toInt()
binding.dsbShadowDx.progress = it.shadowDx.toInt()
binding.dsbShadowDy.progress = it.shadowDy.toInt()
}
}
private val callBack: CallBack?
get() = (parentFragment as? CallBack) ?: (activity as? CallBack)
interface CallBack {
fun selectFont(path: String)
val curFontPath: String
}
}
@@ -12,6 +12,7 @@ import io.legado.app.databinding.DialogTipConfigBinding
import io.legado.app.help.config.AppConfig import io.legado.app.help.config.AppConfig
import io.legado.app.help.config.ReadBookConfig import io.legado.app.help.config.ReadBookConfig
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
import io.legado.app.ui.book.read.ReadBookActivity
import io.legado.app.utils.observeEvent import io.legado.app.utils.observeEvent
import io.legado.app.utils.postEvent import io.legado.app.utils.postEvent
import io.legado.app.utils.requestInputMethod import io.legado.app.utils.requestInputMethod
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M436.41,888.13L436.41,640.72L523.83,640.72L523.83,720.72L848.13,720.72L848.13,808.13L523.83,808.13L523.83,888.13L436.41,888.13ZM111.87,808.13L111.87,720.72L356.41,720.72L356.41,808.13L111.87,808.13ZM253.17,551.87L340.48,551.87L384,431.26L576.28,431.26L618.57,551.87L706.83,551.87L525.63,71.87L434.37,71.87L253.17,551.87ZM408.48,359.15L478,161.83L481.52,161.83L550.8,359.15L408.48,359.15Z"/>
</vector>
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M280,800L280,280L80,280L80,160L600,160L600,280L400,280L400,800L280,800ZM640,800L640,480L520,480L520,360L880,360L880,480L760,480L760,800L640,800Z"/>
</vector>
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M249,831L249,280L49,280L49,129L600,129L600,280L400,280L400,831L249,831ZM640,831L640,511L520,511L520,360L911,360L911,511L791,511L791,831L640,831Z"/>
</vector>
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M315.38,764.62L315.38,244.62L115.38,244.62L115.38,195.38L564.62,195.38L564.62,244.62L364.62,244.62L364.62,764.62L315.38,764.62ZM675.38,764.62L675.38,444.62L555.38,444.62L555.38,395.38L844.62,395.38L844.62,444.62L724.62,444.62L724.62,764.62L675.38,764.62Z"/>
</vector>
+3 -2
View File
@@ -24,7 +24,7 @@
app:titleCollapseMode="scale"> app:titleCollapseMode="scale">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
android:theme="@style/ThemeOverlay.Material3.Toolbar.CircleNavigationButton" android:theme="@style/ThemeOverlay.Material3.Toolbar.CircleNavigationButton"
android:id="@+id/top_bar" android:id="@+id/top_bar"
android:layout_width="match_parent" android:layout_width="match_parent"
@@ -44,7 +44,8 @@ android:theme="@style/ThemeOverlay.Material3.Toolbar.CircleNavigationButton"
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginVertical="8dp" android:layout_marginTop="8dp"
android:layout_marginBottom="60dp"
android:orientation="vertical" android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior"> app:layout_behavior="@string/appbar_scrolling_view_behavior">
+18 -254
View File
@@ -1,22 +1,21 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:gravity="center" android:gravity="center"
android:paddingBottom="16dp" android:paddingBottom="8dp"
android:paddingHorizontal="16dp"> android:paddingHorizontal="16dp">
<com.google.android.material.bottomsheet.BottomSheetDragHandleView <com.google.android.material.bottomsheet.BottomSheetDragHandleView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingVertical="16dp" android:paddingVertical="8dp"
android:minHeight="0dp" android:minHeight="0dp"
android:layout_gravity="center_horizontal" /> android:layout_gravity="center_horizontal" />
@@ -24,260 +23,25 @@
android:id="@+id/bottom_sheet_title" android:id="@+id/bottom_sheet_title"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/text_font" android:text="@string/select_font"
android:textSize="18sp" android:textSize="16sp"
android:textStyle="bold" /> android:textStyle="bold" />
</LinearLayout> </LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="8dp"
android:text="@string/text_typeface"
android:textSize="14sp"
android:textStyle="bold" />
<com.google.android.material.button.MaterialButtonGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:gravity="end|center_vertical">
<io.legado.app.ui.widget.AccentColorButton
android:id="@+id/btn_text_color"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/Widget.Material3Expressive.Button.OutlinedButton"
android:text="@string/text_color" />
<com.google.android.material.button.MaterialButton
android:id="@+id/sw_underline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
app:icon="@drawable/ic_underline"
android:checkable="true"
android:focusable="true"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/sw_dottedline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
app:icon="@drawable/ic_dottedline"
android:checkable="true"
android:focusable="true"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_textItalic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
app:icon="@drawable/ic_format_italic"
android:checkable="true"
android:focusable="true"/>
</com.google.android.material.button.MaterialButtonGroup>
<com.google.android.material.button.MaterialButtonGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
android:paddingVertical="4dp"
android:gravity="end|center_vertical">
<io.legado.app.ui.widget.AccentColorButton
android:id="@+id/btnShadowColor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/Widget.Material3Expressive.Button.OutlinedButton"
android:text="@string/text_shadow_color" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_textShadow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
app:icon="@drawable/ic_shadow"
android:checkable="true"
android:focusable="true"/>
</com.google.android.material.button.MaterialButtonGroup>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end">
<com.google.android.material.button.MaterialButton
android:id="@+id/textFontWeightConverter"
style="@style/Widget.Material3Expressive.Button.IconButton.Tonal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="0dp"
android:textSize="12sp" />
<com.google.android.material.slider.Slider
android:id="@+id/sliderFontWeight"
android:layout_width="160dp"
android:layout_height="wrap_content"
android:stepSize="1"
android:valueFrom="0"
android:valueTo="20"
app:thumbHeight="24dp"
app:trackHeight="24dp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/shadow_typeface"
android:layout_marginHorizontal="16dp"
android:layout_marginVertical="8dp"
android:textSize="14sp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<io.legado.app.ui.widget.SimpleSliderView
android:id="@+id/dsb_shadow_dx"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="32dp"
android:layout_weight="1"
app:isBottomBackground="true"
app:max="20"
app:title="@string/text_shadow_x" />
<io.legado.app.ui.widget.SimpleSliderView
android:id="@+id/dsb_shadow_dy"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
app:isBottomBackground="true"
app:max="20"
app:title="@string/text_shadow_y" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="bottom">
<io.legado.app.ui.widget.SimpleSliderView
android:id="@+id/dsb_shadow_radius"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="32dp"
android:layout_weight="1"
app:isBottomBackground="true"
app:max="50"
app:title="@string/text_shadow_radius" />
<io.legado.app.ui.widget.SimpleSliderView
android:id="@+id/btn_indent_layout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
app:title="@string/text_indent"
app:max="4" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<io.legado.app.ui.widget.SimpleSliderView
android:id="@+id/dsb_paragraph_spacing"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="32dp"
android:layout_weight="1"
app:max="20"
app:isBottomBackground="true"
app:title="@string/paragraph_size" />
<io.legado.app.ui.widget.SimpleSliderView
android:id="@+id/dsb_line_size"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
app:isBottomBackground="true"
app:max="20"
app:title="@string/line_size" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<io.legado.app.ui.widget.SimpleSliderView
android:id="@+id/dsb_text_letter_spacing"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
app:isBottomBackground="true"
app:max="100"
app:title="@string/text_letter_spacing" />
</LinearLayout>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/select_font"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="8dp"
android:textSize="14sp"
android:textStyle="bold" />
<com.google.android.material.button.MaterialButtonGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:paddingHorizontal="16dp">
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_default_fonts"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/Widget.Material3Expressive.Button.OutlinedButton"
android:text="@string/default_font"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_other_dir"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/Widget.Material3Expressive.Button.OutlinedButton"
android:text="@string/other_folder"/>
</com.google.android.material.button.MaterialButtonGroup>
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view" android:id="@+id/recyclerView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="0dp"
android:layout_margin="2dp" /> android:layout_weight="1" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_other_dir"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginVertical="8dp"
style="@style/Widget.Material3Expressive.Button.OutlinedButton"
android:text="@string/other_folder"/>
</LinearLayout> </LinearLayout>
@@ -17,7 +17,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:gravity="center" android:gravity="center"
android:paddingBottom="4dp" android:paddingBottom="8dp"
android:paddingHorizontal="16dp"> android:paddingHorizontal="16dp">
<com.google.android.material.bottomsheet.BottomSheetDragHandleView <com.google.android.material.bottomsheet.BottomSheetDragHandleView
@@ -30,7 +30,7 @@
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingVertical="8dp" android:paddingTop="8dp"
android:orientation="horizontal"> android:orientation="horizontal">
<TextView <TextView
@@ -287,6 +287,7 @@
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tool:listitem="@layout/item_read_style" tool:listitem="@layout/item_read_style"
app:layout_constraintStart_toEndOf="@id/cb_share_layout" app:layout_constraintStart_toEndOf="@id/cb_share_layout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/> app:layout_constraintBottom_toBottomOf="parent"/>
+4 -4
View File
@@ -12,22 +12,22 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:gravity="center" android:gravity="center"
android:paddingBottom="16dp" android:paddingBottom="8dp"
android:paddingHorizontal="16dp"> android:paddingHorizontal="16dp">
<com.google.android.material.bottomsheet.BottomSheetDragHandleView <com.google.android.material.bottomsheet.BottomSheetDragHandleView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingVertical="16dp" android:layout_gravity="center_horizontal"
android:minHeight="0dp" android:minHeight="0dp"
android:layout_gravity="center_horizontal" /> android:paddingVertical="8dp" />
<TextView <TextView
android:id="@+id/bottom_sheet_title" android:id="@+id/bottom_sheet_title"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/header_footer" android:text="@string/header_footer"
android:textSize="18sp" android:textSize="16sp"
android:textStyle="bold" /> android:textStyle="bold" />
</LinearLayout> </LinearLayout>
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="32dp"
android:paddingBottom="16dp"
android:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto">
<io.legado.app.ui.widget.SimpleSliderView
android:id="@+id/dsb_shadow_dx"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:isBottomBackground="true"
app:max="20"
app:title="@string/text_shadow_x" />
<io.legado.app.ui.widget.SimpleSliderView
android:id="@+id/dsb_shadow_dy"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:isBottomBackground="true"
app:max="20"
app:title="@string/text_shadow_y" />
<io.legado.app.ui.widget.SimpleSliderView
android:id="@+id/dsb_shadow_radius"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:isBottomBackground="true"
app:max="50"
app:title="@string/text_shadow_radius" />
</LinearLayout>
@@ -16,13 +16,13 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:gravity="center" android:gravity="center"
android:paddingBottom="16dp" android:paddingBottom="8dp"
android:paddingHorizontal="16dp"> android:paddingHorizontal="16dp">
<com.google.android.material.bottomsheet.BottomSheetDragHandleView <com.google.android.material.bottomsheet.BottomSheetDragHandleView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingVertical="16dp" android:paddingVertical="8dp"
android:minHeight="0dp" android:minHeight="0dp"
android:layout_gravity="center_horizontal" /> android:layout_gravity="center_horizontal" />
@@ -31,7 +31,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/read_config" android:text="@string/read_config"
android:textSize="18sp" android:textSize="16sp"
android:textStyle="bold" /> android:textStyle="bold" />
</LinearLayout> </LinearLayout>
@@ -25,8 +25,14 @@
android:id="@+id/loading" android:id="@+id/loading"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:progress="50"
app:trackColor="?attr/colorOnSurfaceVariant"
app:indicatorColor="?attr/colorPrimaryVariant"
android:indeterminate="false" android:indeterminate="false"
app:indicatorSize="64dp" app:indicatorSize="64dp"
app:waveAmplitude="2dp"
app:wavelength="16dp"
app:waveSpeed="50dp"
android:layout_gravity="center" /> android:layout_gravity="center" />
@@ -44,8 +50,7 @@
app:icon="@drawable/ic_refresh" app:icon="@drawable/ic_refresh"
app:iconSize="24sp" app:iconSize="24sp"
app:iconTint="?attr/colorSurfaceVariant" app:iconTint="?attr/colorSurfaceVariant"
android:visibility="gone" android:visibility="gone" />
tools:visibility="visible" />
<TextView <TextView
android:id="@+id/progress" android:id="@+id/progress"
+2
View File
@@ -1337,4 +1337,6 @@
<string name="long_click_to_custom">长按自定义</string> <string name="long_click_to_custom">长按自定义</string>
<string name="disable_manga_scroll_animation">禁用翻页动画</string> <string name="disable_manga_scroll_animation">禁用翻页动画</string>
<string name="manga_cross_fade">禁用加载淡入动画</string> <string name="manga_cross_fade">禁用加载淡入动画</string>
<string name="text_shadow_set">阴影设置</string>
<string name="paragraph_typeface">段落样式</string>
</resources> </resources>
+2
View File
@@ -1338,4 +1338,6 @@
<string name="long_click_to_custom">长按自定义</string> <string name="long_click_to_custom">长按自定义</string>
<string name="disable_manga_scroll_animation">禁用翻页动画</string> <string name="disable_manga_scroll_animation">禁用翻页动画</string>
<string name="manga_cross_fade">禁用加载淡入动画</string> <string name="manga_cross_fade">禁用加载淡入动画</string>
<string name="text_shadow_set">阴影设置</string>
<string name="paragraph_typeface">段落样式</string>
</resources> </resources>