diff --git a/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt b/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt index 93657544f..9c3469f02 100644 --- a/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt +++ b/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt @@ -192,6 +192,7 @@ object PreferKey { const val showBottomView = "showBottomView" const val mangaScrollMode = "mangaScrollMode" const val webtoonSidePaddingDp = "webtoonSidePaddingDp" + const val mangaVolumeKeyPage = "mangaVolumeKeyPage" const val mangaClickActionTL = "mangaClickActionTopLeft" const val mangaClickActionTC = "mangaClickActionTopCenter" diff --git a/app/src/main/java/io/legato/kazusa/data/entities/Book.kt b/app/src/main/java/io/legato/kazusa/data/entities/Book.kt index 8548c8f25..efee7cb44 100644 --- a/app/src/main/java/io/legato/kazusa/data/entities/Book.kt +++ b/app/src/main/java/io/legato/kazusa/data/entities/Book.kt @@ -402,8 +402,11 @@ data class Book( var readSimulating: Boolean = false, var startDate: LocalDate? = null, var startChapter: Int? = null, // 用户设置的起始章节 - var dailyChapters: Int = 3 // 用户设置的每日更新章节数 + var dailyChapters: Int = 3, // 用户设置的每日更新章节数 + val mangaColorFilter: String? = null, + var mangaScrollMode: Int? = null, + var webtoonSidePaddingDp: Int? = null ) : Parcelable diff --git a/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt b/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt index 9b7fdba06..37ce351a7 100644 --- a/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt +++ b/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt @@ -743,29 +743,33 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { appCtx.putPrefBoolean(PreferKey.enableMangaEInk, value) } + //墨水屏阈值 var mangaEInkThreshold get() = appCtx.getPrefInt(PreferKey.mangaEInkThreshold, 150) set(value) { appCtx.putPrefInt(PreferKey.mangaEInkThreshold, value) } - var disableHorizontalAnimator - get() = appCtx.getPrefBoolean(PreferKey.disableHorizontalAnimator, false) - set(value) { - appCtx.putPrefBoolean(PreferKey.disableHorizontalAnimator, value) - } - + //漫画灰度 var enableMangaGray get() = appCtx.getPrefBoolean(PreferKey.enableMangaGray, false) set(value) { appCtx.putPrefBoolean(PreferKey.enableMangaGray, value) } + //条漫侧边距 var webtoonSidePaddingDp: Int get() = appCtx.getPrefInt(PreferKey.webtoonSidePaddingDp, 0) set(value) { appCtx.putPrefInt(PreferKey.webtoonSidePaddingDp, value) } + //漫画音量键翻页 + var MangaVolumeKeyPage: Boolean + get() = appCtx.getPrefBoolean(PreferKey.mangaVolumeKeyPage, false) + set(value) { + appCtx.putPrefBoolean(PreferKey.mangaVolumeKeyPage, value) + } + } diff --git a/app/src/main/java/io/legato/kazusa/ui/book/group/GroupEditDialog.kt b/app/src/main/java/io/legato/kazusa/ui/book/group/GroupEditDialog.kt index 20e83d4a3..51a0c8074 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/group/GroupEditDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/group/GroupEditDialog.kt @@ -1,14 +1,15 @@ package io.legato.kazusa.ui.book.group +//import io.legado.app.lib.theme.primaryColor import android.os.Bundle import android.view.View +import androidx.appcompat.widget.PopupMenu import androidx.fragment.app.viewModels import io.legato.kazusa.R import io.legato.kazusa.base.BaseBottomSheetDialogFragment import io.legato.kazusa.data.entities.BookGroup import io.legato.kazusa.databinding.DialogBookGroupEditBinding import io.legato.kazusa.lib.dialogs.alert -//import io.legado.app.lib.theme.primaryColor import io.legato.kazusa.utils.FileUtils import io.legato.kazusa.utils.MD5Utils import io.legato.kazusa.utils.SelectImageContract @@ -19,7 +20,6 @@ import io.legato.kazusa.utils.launch import io.legato.kazusa.utils.readUri import io.legato.kazusa.utils.toastOnUi import io.legato.kazusa.utils.viewbindingdelegate.viewBinding -import io.legato.kazusa.utils.visible import splitties.init.appCtx import splitties.views.onClick import java.io.FileOutputStream @@ -32,6 +32,9 @@ class GroupEditDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_book_gro } } + private var selectedSortIndex = -1 + private lateinit var sortOptions: List + private val binding by viewBinding(DialogBookGroupEditBinding::bind) private val viewModel by viewModels() private var bookGroup: BookGroup? = null @@ -62,21 +65,40 @@ class GroupEditDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_book_gro override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { //binding.toolBar.setBackgroundColor(primaryColor) + sortOptions = resources.getStringArray(R.array.book_sort).toList() + @Suppress("DEPRECATION") bookGroup = arguments?.getParcelable("group") bookGroup?.let { - binding.btnDelete.visible(it.groupId > 0 || it.groupId == Long.MIN_VALUE) + binding.btnDelete.isEnabled = (it.groupId > 0 || it.groupId == Long.MIN_VALUE) binding.tieGroupName.setText(it.groupName) if (bookGroup?.cover != null) binding.ivCover.load(it.cover) - binding.spSort.setSelection(it.bookSort + 1) binding.cbEnableRefresh.isChecked = it.enableRefresh + if (it.bookSort in sortOptions.indices) { + selectedSortIndex = it.bookSort + binding.chipSortMenu.text = sortOptions[selectedSortIndex] + } } ?: let { - binding.toolBar.title = getString(R.string.add_group) binding.btnDelete.gone() binding.ivCover.load() } + binding.run { + chipSortMenu.setOnClickListener { chip -> + PopupMenu(requireContext(), chip).apply { + sortOptions.forEachIndexed { index, title -> + menu.add(0, index, index, title) + } + setOnMenuItemClickListener { item -> + selectedSortIndex = item.itemId + chipSortMenu.text = sortOptions[selectedSortIndex] + true + } + show() + } + } + ivCover.onClick { selectImage.launch() } @@ -88,15 +110,17 @@ class GroupEditDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_book_gro } } } + btnCancel.onClick { dismiss() } + btnOk.onClick { val groupName = tieGroupName.text?.toString() if (groupName.isNullOrEmpty()) { toastOnUi("分组名称不能为空") } else { - val bookSort = binding.spSort.selectedItemPosition - 1 + val bookSort = selectedSortIndex val coverPath = binding.ivCover.bitmapPath val enableRefresh = binding.cbEnableRefresh.isChecked bookGroup?.let { diff --git a/app/src/main/java/io/legato/kazusa/ui/book/manga/ReadMangaActivity.kt b/app/src/main/java/io/legato/kazusa/ui/book/manga/ReadMangaActivity.kt index e46456d7d..f5b52e635 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/manga/ReadMangaActivity.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/manga/ReadMangaActivity.kt @@ -4,7 +4,6 @@ import android.annotation.SuppressLint import android.content.Intent import android.os.Build import android.os.Bundle -import android.os.Looper import android.view.KeyEvent import android.view.Menu import android.view.MenuItem @@ -202,8 +201,12 @@ class ReadMangaActivity : VMBaseActivity if (mAdapter.isNotEmpty()) { val item = mAdapter.getItem(position) @@ -267,10 +269,10 @@ class ReadMangaActivity : VMBaseActivity { - scrollToPrev() - return true - } + if (AppConfig.MangaVolumeKeyPage) { + when (keyCode) { + KeyEvent.KEYCODE_VOLUME_UP -> { + scrollToPrev() + return true + } - KeyEvent.KEYCODE_VOLUME_DOWN -> { - scrollToNext() - return true + KeyEvent.KEYCODE_VOLUME_DOWN -> { + scrollToNext() + return true + } } } + return super.onKeyDown(keyCode, event) } diff --git a/app/src/main/java/io/legato/kazusa/ui/book/manga/ReadMangaViewModel.kt b/app/src/main/java/io/legato/kazusa/ui/book/manga/ReadMangaViewModel.kt index 23fde093d..41061e5df 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/manga/ReadMangaViewModel.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/manga/ReadMangaViewModel.kt @@ -9,6 +9,7 @@ import io.legato.kazusa.constant.BookType import io.legato.kazusa.constant.EventBus import io.legato.kazusa.data.appDb import io.legato.kazusa.data.entities.Book +import io.legato.kazusa.data.entities.Book.ReadConfig import io.legato.kazusa.data.entities.BookChapter import io.legato.kazusa.data.entities.BookProgress import io.legato.kazusa.exception.NoStackTraceException @@ -273,6 +274,29 @@ class ReadMangaViewModel(application: Application) : BaseViewModel(application) } } + + fun getEffectiveScrollMode(): Int { + return ReadManga.book?.readConfig?.mangaScrollMode ?: AppConfig.mangaScrollMode + } + + fun getEffectiveWebtoonSidePadding(): Int { + return ReadManga.book?.readConfig?.webtoonSidePaddingDp ?: AppConfig.webtoonSidePaddingDp + } + + + fun updateReadConfig(update: ReadConfig.() -> Unit) { + val book = ReadManga.book ?: return + val config = book.readConfig ?: ReadConfig() + config.update() + book.readConfig = config + + execute { + appDb.bookDao.update(book) + }.onError { + AppLog.put("更新阅读配置失败\n${it.localizedMessage}", it) + } + } + override fun onCleared() { super.onCleared() changeSourceCoroutine?.cancel() diff --git a/app/src/main/java/io/legato/kazusa/ui/book/manga/config/MangaScrollModeDialog.kt b/app/src/main/java/io/legato/kazusa/ui/book/manga/config/MangaScrollModeDialog.kt index 99f0f01a4..433b9d134 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/manga/config/MangaScrollModeDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/manga/config/MangaScrollModeDialog.kt @@ -14,6 +14,9 @@ class MangaScrollModeDialog : BaseBottomSheetDialogFragment(R.layout.dialog_mang private val binding by viewBinding(DialogMangaScrollModeBinding::bind) var initialAutoPageEnabled: Boolean = false + var initialWebtoonSidePadding: Int = 0 + var initialScrollMode: Int = MangaScrollMode.PAGE_RIGHT_TO_LEFT + var callback: Callback? = null override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { @@ -27,7 +30,7 @@ class MangaScrollModeDialog : BaseBottomSheetDialogFragment(R.layout.dialog_mang binding.chipGroupScrollMode.addView(Chip(requireContext()).apply { text = MangaScrollMode.labelOf(mode) isCheckable = true - isChecked = (mode == AppConfig.mangaScrollMode) + isChecked = (mode == initialScrollMode) setOnClickListener { callback?.onScrollModeChanged(mode) @@ -65,9 +68,16 @@ class MangaScrollModeDialog : BaseBottomSheetDialogFragment(R.layout.dialog_mang } } + binding.checkboxVolumeKeyPage.apply { + isChecked = AppConfig.MangaVolumeKeyPage + setOnCheckedChangeListener { _, isChecked -> + callback?.onVolumeKeyPageChanged(isChecked) + } + } + binding.scvPadding.apply { valueFormat = { "$it %" } - progress = AppConfig.webtoonSidePaddingDp + progress = initialWebtoonSidePadding onChanged = { newValue -> callback?.upSidePadding(newValue) } @@ -96,6 +106,7 @@ class MangaScrollModeDialog : BaseBottomSheetDialogFragment(R.layout.dialog_mang fun onMangaScaleDisabledChanged(disabled: Boolean) fun upSidePadding(padding: Int) fun onHideMangaTitleChanged(hide: Boolean) + fun onVolumeKeyPageChanged(enable: Boolean) } } diff --git a/app/src/main/java/io/legato/kazusa/ui/book/read/config/ReadStyleDialog.kt b/app/src/main/java/io/legato/kazusa/ui/book/read/config/ReadStyleDialog.kt index f4aebace5..90a8f7082 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/read/config/ReadStyleDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/read/config/ReadStyleDialog.kt @@ -2,6 +2,7 @@ package io.legato.kazusa.ui.book.read.config import android.content.DialogInterface import android.os.Bundle +import android.view.Gravity import android.view.View import android.view.ViewGroup import androidx.core.view.get @@ -15,6 +16,7 @@ import io.legato.kazusa.databinding.DialogReadBookStyleBinding import io.legato.kazusa.databinding.ItemReadStyleBinding import io.legato.kazusa.help.config.AppConfig import io.legato.kazusa.help.config.ReadBookConfig +import io.legato.kazusa.help.config.ThemeConfig import io.legato.kazusa.lib.dialogs.selector import io.legato.kazusa.model.ReadBook import io.legato.kazusa.ui.book.read.ReadBookActivity @@ -22,9 +24,8 @@ import io.legato.kazusa.ui.font.FontSelectDialog import io.legato.kazusa.utils.ChineseUtils import io.legato.kazusa.utils.postEvent import io.legato.kazusa.utils.showDialogFragment +import io.legato.kazusa.utils.themeColor import io.legato.kazusa.utils.viewbindingdelegate.viewBinding -import splitties.views.onLongClick -import io.legato.kazusa.help.config.ThemeConfig class ReadStyleDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_book_style), FontSelectDialog.CallBack { @@ -229,32 +230,35 @@ class ReadStyleDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_book_ payloads: MutableList ) { binding.apply { - ivStyle.setText(item.name.ifBlank { "文字" }) - ivStyle.setTextColor(item.curTextColor()) + tvStyle.text = item.name.ifBlank { "文字" } + tvStyle.setTextColor(item.curTextColor()) ivStyle.setImageDrawable(item.curBgDrawable(100, 150)) if (ReadBookConfig.styleSelect == holder.layoutPosition) { - //ivStyle.borderColor = accentColor - ivStyle.setTextBold(true) + llStyle.gravity = Gravity.TOP + cdStyle.strokeColor = + context.themeColor(com.google.android.material.R.attr.colorTertiary) + rvStyle.setCardBackgroundColor(context.themeColor(com.google.android.material.R.attr.colorTertiary)) + //tvStyle.setTextBold(true) } else { - ivStyle.borderColor = item.curTextColor() - ivStyle.setTextBold(false) + cdStyle.strokeColor = item.curTextColor() + //tvStyle.setTextBold(false) } } } override fun registerListener(holder: ItemViewHolder, binding: ItemReadStyleBinding) { binding.apply { - ivStyle.setOnClickListener { - if (ivStyle.isInView) { - changeBgTextConfig(holder.layoutPosition) - } + // ivStyle 现在是 MaterialCardView + cdStyle.setOnClickListener { + changeBgTextConfig(holder.layoutPosition) } - ivStyle.onLongClick(ivStyle.isInView) { - if (ivStyle.isInView) { - showBgTextConfig(holder.layoutPosition) - } + + cdStyle.setOnLongClickListener { + showBgTextConfig(holder.layoutPosition) + true // 表示事件已消费 } } } + } } \ No newline at end of file diff --git a/app/src/main/java/io/legato/kazusa/ui/book/source/manage/BookSourceAdapter.kt b/app/src/main/java/io/legato/kazusa/ui/book/source/manage/BookSourceAdapter.kt index b79aab3ef..fe34498cc 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/source/manage/BookSourceAdapter.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/source/manage/BookSourceAdapter.kt @@ -1,22 +1,21 @@ package io.legato.kazusa.ui.book.source.manage +//import io.legado.app.lib.theme.backgroundColor import android.content.Context -import android.graphics.Color import android.os.Bundle import android.view.View import android.view.ViewGroup -import android.widget.ImageView import android.widget.PopupMenu import androidx.core.os.bundleOf import androidx.core.view.doOnLayout import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.card.MaterialCardView import io.legato.kazusa.R import io.legato.kazusa.base.adapter.ItemViewHolder import io.legato.kazusa.base.adapter.RecyclerAdapter import io.legato.kazusa.data.entities.BookSourcePart import io.legato.kazusa.databinding.ItemBookSourceBinding -//import io.legado.app.lib.theme.backgroundColor import io.legato.kazusa.model.Debug import io.legato.kazusa.ui.login.SourceLoginActivity import io.legato.kazusa.ui.widget.recycler.DragSelectTouchHelper @@ -25,6 +24,7 @@ import io.legato.kazusa.utils.buildMainHandler import io.legato.kazusa.utils.gone import io.legato.kazusa.utils.invisible import io.legato.kazusa.utils.startActivity +import io.legato.kazusa.utils.themeColor import io.legato.kazusa.utils.visible import java.util.Collections @@ -208,20 +208,20 @@ class BookSourceAdapter( popupMenu.show() } - private fun upShowExplore(iv: ImageView, source: BookSourcePart) { + private fun upShowExplore(iv: MaterialCardView, source: BookSourcePart) { when { !source.hasExploreUrl -> { iv.invisible() } source.enabledExplore -> { - iv.setColorFilter(Color.GREEN) + iv.setCardBackgroundColor(context.themeColor(androidx.appcompat.R.attr.colorPrimary)) iv.visible() iv.contentDescription = context.getString(R.string.tag_explore_enabled) } else -> { - iv.setColorFilter(Color.RED) + iv.setCardBackgroundColor(context.themeColor(com.google.android.material.R.attr.colorOnError)) iv.visible() iv.contentDescription = context.getString(R.string.tag_explore_disabled) } diff --git a/app/src/main/java/io/legato/kazusa/ui/widget/image/CircleImageView.kt b/app/src/main/java/io/legato/kazusa/ui/widget/image/CircleImageView.kt deleted file mode 100644 index d0d281366..000000000 --- a/app/src/main/java/io/legato/kazusa/ui/widget/image/CircleImageView.kt +++ /dev/null @@ -1,445 +0,0 @@ -package io.legato.kazusa.ui.widget.image - -import android.annotation.SuppressLint -import android.content.Context -import android.graphics.* -import android.graphics.drawable.BitmapDrawable -import android.graphics.drawable.ColorDrawable -import android.graphics.drawable.Drawable -import android.net.Uri -import android.text.TextPaint -import android.util.AttributeSet -import android.view.MotionEvent -import android.view.View -import android.view.ViewOutlineProvider -import androidx.annotation.ColorInt -import androidx.annotation.ColorRes -import androidx.annotation.DrawableRes -import androidx.appcompat.widget.AppCompatImageView -import io.legato.kazusa.R -import io.legato.kazusa.utils.getCompatColor -import io.legato.kazusa.utils.printOnDebug -import io.legato.kazusa.utils.spToPx -import kotlin.math.min -import kotlin.math.pow -import androidx.core.graphics.createBitmap -import io.legato.kazusa.utils.themeColor -import androidx.core.content.withStyledAttributes - -@Suppress("unused", "MemberVisibilityCanBePrivate") -class CircleImageView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null -) : AppCompatImageView(context, attrs) { - - private val mDrawableRect = RectF() - private val mBorderRect = RectF() - - private val mShaderMatrix = Matrix() - private val mBitmapPaint = Paint() - private val mBorderPaint = Paint() - private val mCircleBackgroundPaint = Paint() - private val textPaint by lazy { - val textPaint = TextPaint() - textPaint.isAntiAlias = true - textPaint.textAlign = Paint.Align.CENTER - textPaint - } - - private var mBorderColor = DEFAULT_BORDER_COLOR - private var mBorderWidth = DEFAULT_BORDER_WIDTH - private var mCircleBackgroundColor = DEFAULT_CIRCLE_BACKGROUND_COLOR - - private var mBitmap: Bitmap? = null - private var mBitmapShader: BitmapShader? = null - private var mBitmapWidth: Int = 0 - private var mBitmapHeight: Int = 0 - - private var mDrawableRadius: Float = 0.toFloat() - private var mBorderRadius: Float = 0.toFloat() - - private var mColorFilter: ColorFilter? = null - - private var mReady: Boolean = false - private var mSetupPending: Boolean = false - private var mBorderOverlay: Boolean = false - var isDisableCircularTransformation: Boolean = false - set(disableCircularTransformation) { - if (field == disableCircularTransformation) { - return - } - field = disableCircularTransformation - initializeBitmap() - } - - var borderColor: Int - get() = mBorderColor - set(@ColorInt borderColor) { - if (borderColor == mBorderColor) { - return - } - - mBorderColor = borderColor - mBorderPaint.color = mBorderColor - invalidate() - } - - var circleBackgroundColor: Int - get() = mCircleBackgroundColor - set(@ColorInt circleBackgroundColor) { - if (circleBackgroundColor == mCircleBackgroundColor) { - return - } - mCircleBackgroundColor = circleBackgroundColor - mCircleBackgroundPaint.color = circleBackgroundColor - invalidate() - } - - var borderWidth: Int - get() = mBorderWidth - set(borderWidth) { - if (borderWidth == mBorderWidth) { - return - } - - mBorderWidth = borderWidth - setup() - } - - var isBorderOverlay: Boolean - get() = mBorderOverlay - set(borderOverlay) { - if (borderOverlay == mBorderOverlay) { - return - } - - mBorderOverlay = borderOverlay - setup() - } - - private var text: String? = null - - private var textColor = context.themeColor(com.google.android.material.R.attr.colorOnSurface) - private var textBold = false - var isInView = false - - init { - context.withStyledAttributes(attrs, R.styleable.CircleImageView) { - mBorderWidth = - getDimensionPixelSize( - R.styleable.CircleImageView_civ_border_width, - DEFAULT_BORDER_WIDTH - ) - mBorderColor = - getColor(R.styleable.CircleImageView_civ_border_color, DEFAULT_BORDER_COLOR) - mBorderOverlay = - getBoolean(R.styleable.CircleImageView_civ_border_overlay, DEFAULT_BORDER_OVERLAY) - mCircleBackgroundColor = - getColor( - R.styleable.CircleImageView_civ_circle_background_color, - DEFAULT_CIRCLE_BACKGROUND_COLOR - ) - text = getString(R.styleable.CircleImageView_text) - contentDescription = text - if (hasValue(R.styleable.CircleImageView_textColor)) { - textColor = getColor( - R.styleable.CircleImageView_textColor, - context.themeColor(com.google.android.material.R.attr.colorOnSurface) - ) - } - } - - mReady = true - - if (mSetupPending) { - setup() - mSetupPending = false - } - } - - override fun setAdjustViewBounds(adjustViewBounds: Boolean) { - if (adjustViewBounds) { - throw IllegalArgumentException("adjustViewBounds not supported.") - } - } - - override fun onDraw(canvas: Canvas) { - if (isDisableCircularTransformation) { - super.onDraw(canvas) - return - } - if (mBitmap == null) { - return - } - - if (mCircleBackgroundColor != Color.TRANSPARENT) { - canvas.drawCircle( - mDrawableRect.centerX(), - mDrawableRect.centerY(), - mDrawableRadius, - mCircleBackgroundPaint - ) - } - canvas.drawCircle( - mDrawableRect.centerX(), - mDrawableRect.centerY(), - mDrawableRadius, - mBitmapPaint - ) - if (mBorderWidth > 0) { - canvas.drawCircle( - mBorderRect.centerX(), - mBorderRect.centerY(), - mBorderRadius, - mBorderPaint - ) - } - drawText(canvas) - } - - private fun drawText(canvas: Canvas) { - text?.let { - textPaint.color = textColor - textPaint.isFakeBoldText = textBold - textPaint.textSize = 15f.spToPx() - val fm = textPaint.fontMetrics - canvas.drawText( - it, - width * 0.5f, - (height * 0.5f + (fm.bottom - fm.top) * 0.5f - fm.bottom), - textPaint - ) - } - } - - fun setText(text: String?) { - this.text = text - contentDescription = text - invalidate() - } - - fun setTextColor(@ColorInt textColor: Int) { - this.textColor = textColor - invalidate() - } - - fun setTextBold(bold: Boolean) { - this.textBold = bold - invalidate() - } - - override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { - super.onSizeChanged(w, h, oldw, oldh) - setup() - } - - override fun setPadding(left: Int, top: Int, right: Int, bottom: Int) { - super.setPadding(left, top, right, bottom) - setup() - } - - override fun setPaddingRelative(start: Int, top: Int, end: Int, bottom: Int) { - super.setPaddingRelative(start, top, end, bottom) - setup() - } - - fun setCircleBackgroundColorResource(@ColorRes circleBackgroundRes: Int) { - circleBackgroundColor = context.getCompatColor(circleBackgroundRes) - } - - override fun setImageBitmap(bm: Bitmap) { - super.setImageBitmap(bm) - initializeBitmap() - } - - override fun setImageDrawable(drawable: Drawable?) { - super.setImageDrawable(drawable) - initializeBitmap() - } - - override fun setImageResource(@DrawableRes resId: Int) { - super.setImageResource(resId) - initializeBitmap() - } - - override fun setImageURI(uri: Uri?) { - super.setImageURI(uri) - initializeBitmap() - } - - override fun setColorFilter(cf: ColorFilter) { - if (cf === mColorFilter) { - return - } - - mColorFilter = cf - applyColorFilter() - invalidate() - } - - override fun getColorFilter(): ColorFilter? { - return mColorFilter - } - - private fun applyColorFilter() { - mBitmapPaint.colorFilter = mColorFilter - } - - private fun getBitmapFromDrawable(drawable: Drawable?): Bitmap? { - if (drawable == null) { - return null - } - - if (drawable is BitmapDrawable) { - return drawable.bitmap - } - - return try { - val bitmap: Bitmap = if (drawable is ColorDrawable) { - createBitmap(COLOR_DRAWABLE_DIMENSION, COLOR_DRAWABLE_DIMENSION, BITMAP_CONFIG) - } else { - createBitmap(drawable.intrinsicWidth, drawable.intrinsicHeight, BITMAP_CONFIG) - } - - val canvas = Canvas(bitmap) - drawable.setBounds(0, 0, canvas.width, canvas.height) - drawable.draw(canvas) - bitmap - } catch (e: Exception) { - e.printOnDebug() - null - } - - } - - private fun initializeBitmap() { - mBitmap = if (isDisableCircularTransformation) { - null - } else { - getBitmapFromDrawable(drawable) - } - setup() - } - - private fun setup() { - if (!mReady) { - mSetupPending = true - return - } - - if (width == 0 && height == 0) { - return - } - - if (mBitmap == null) { - invalidate() - return - } - - mBitmapShader = BitmapShader(mBitmap!!, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP) - - mBitmapPaint.isAntiAlias = true - mBitmapPaint.shader = mBitmapShader - - mBorderPaint.style = Paint.Style.STROKE - mBorderPaint.isAntiAlias = true - mBorderPaint.color = mBorderColor - mBorderPaint.strokeWidth = mBorderWidth.toFloat() - - mCircleBackgroundPaint.style = Paint.Style.FILL - mCircleBackgroundPaint.isAntiAlias = true - mCircleBackgroundPaint.color = mCircleBackgroundColor - - mBitmapHeight = mBitmap!!.height - mBitmapWidth = mBitmap!!.width - - mBorderRect.set(calculateBounds()) - mBorderRadius = - min( - (mBorderRect.height() - mBorderWidth) / 2.0f, - (mBorderRect.width() - mBorderWidth) / 2.0f - ) - - mDrawableRect.set(mBorderRect) - if (!mBorderOverlay && mBorderWidth > 0) { - mDrawableRect.inset(mBorderWidth - 1.0f, mBorderWidth - 1.0f) - } - mDrawableRadius = min(mDrawableRect.height() / 2.0f, mDrawableRect.width() / 2.0f) - - applyColorFilter() - updateShaderMatrix() - invalidate() - } - - private fun calculateBounds(): RectF { - val availableWidth = width - paddingLeft - paddingRight - val availableHeight = height - paddingTop - paddingBottom - - val sideLength = min(availableWidth, availableHeight) - - val left = paddingLeft + (availableWidth - sideLength) / 2f - val top = paddingTop + (availableHeight - sideLength) / 2f - - return RectF(left, top, left + sideLength, top + sideLength) - } - - private fun updateShaderMatrix() { - val scale: Float - var dx = 0f - var dy = 0f - - mShaderMatrix.set(null) - - if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) { - scale = mDrawableRect.height() / mBitmapHeight.toFloat() - dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f - } else { - scale = mDrawableRect.width() / mBitmapWidth.toFloat() - dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f - } - - mShaderMatrix.setScale(scale, scale) - mShaderMatrix.postTranslate( - (dx + 0.5f).toInt() + mDrawableRect.left, - (dy + 0.5f).toInt() + mDrawableRect.top - ) - - mBitmapShader!!.setLocalMatrix(mShaderMatrix) - } - - @SuppressLint("ClickableViewAccessibility") - override fun onTouchEvent(event: MotionEvent): Boolean { - when (event.action) { - MotionEvent.ACTION_DOWN -> { - isInView = (inTouchableArea(event.x, event.y)) - } - } - return super.onTouchEvent(event) - } - - private fun inTouchableArea(x: Float, y: Float): Boolean { - return (x - mBorderRect.centerX()).toDouble() - .pow(2.0) + (y - mBorderRect.centerY()).toDouble() - .pow(2.0) <= mBorderRadius.toDouble().pow(2.0) - } - - private inner class OutlineProvider : ViewOutlineProvider() { - - override fun getOutline(view: View, outline: Outline) { - val bounds = Rect() - mBorderRect.roundOut(bounds) - outline.setRoundRect(bounds, bounds.width() / 2.0f) - } - - } - - companion object { - private val BITMAP_CONFIG = Bitmap.Config.ARGB_8888 - private const val COLOR_DRAWABLE_DIMENSION = 2 - private const val DEFAULT_BORDER_WIDTH = 0 - private const val DEFAULT_BORDER_COLOR = Color.BLACK - private const val DEFAULT_CIRCLE_BACKGROUND_COLOR = Color.TRANSPARENT - private const val DEFAULT_BORDER_OVERLAY = false - } - -} \ No newline at end of file diff --git a/app/src/main/res/layout-land/activity_book_info.xml b/app/src/main/res/layout-land/activity_book_info.xml index 468ad46ef..84fee84eb 100644 --- a/app/src/main/res/layout-land/activity_book_info.xml +++ b/app/src/main/res/layout-land/activity_book_info.xml @@ -203,7 +203,7 @@ + app:iconTint="?attr/colorOnPrimary" /> diff --git a/app/src/main/res/layout/activity_audio_play.xml b/app/src/main/res/layout/activity_audio_play.xml index abdc3a0ed..276b00669 100644 --- a/app/src/main/res/layout/activity_audio_play.xml +++ b/app/src/main/res/layout/activity_audio_play.xml @@ -55,7 +55,7 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@id/title_bar" /> - @@ -116,7 +116,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" - style="@style/Widget.Material3.Button.TonalButton" + style="@style/Widget.Material3Expressive.Button.TonalButton" android:layout_marginStart="8dp" android:padding="8dp" android:text="@string/change_cover_source" /> @@ -126,7 +126,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" - style="@style/Widget.Material3.Button.TonalButton" + style="@style/Widget.Material3Expressive.Button.TonalButton" android:layout_marginStart="8dp" android:padding="8dp" android:text="@string/refresh_cover" /> diff --git a/app/src/main/res/layout/activity_manga.xml b/app/src/main/res/layout/activity_manga.xml index 0827888fa..e786721ed 100644 --- a/app/src/main/res/layout/activity_manga.xml +++ b/app/src/main/res/layout/activity_manga.xml @@ -50,20 +50,17 @@ android:gravity="center" android:orientation="vertical"> - + app:indicatorSize="64dp" /> diff --git a/app/src/main/res/layout/dialog_auto_read.xml b/app/src/main/res/layout/dialog_auto_read.xml index ba1f70bd7..858560a47 100644 --- a/app/src/main/res/layout/dialog_auto_read.xml +++ b/app/src/main/res/layout/dialog_auto_read.xml @@ -5,60 +5,51 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingHorizontal="16dp" - android:paddingVertical="8dp" + android:paddingBottom="16dp" android:orientation="vertical"> + + + android:gravity="center_horizontal" + android:orientation="horizontal"> - - - + android:text="@string/auto_page_speed" /> - - - - - - - + android:layout_marginStart="8dp" + android:textSize="16sp" /> + + diff --git a/app/src/main/res/layout/dialog_book_group_edit.xml b/app/src/main/res/layout/dialog_book_group_edit.xml index bdb896dc1..bed1cf93e 100644 --- a/app/src/main/res/layout/dialog_book_group_edit.xml +++ b/app/src/main/res/layout/dialog_book_group_edit.xml @@ -4,24 +4,39 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" + android:fillViewport="true" + android:paddingHorizontal="16dp" + android:paddingBottom="16dp" android:orientation="vertical"> - + android:gravity="center" + android:orientation="vertical" + android:paddingBottom="8dp"> + + + + + + + android:paddingVertical="16dp"> - + android:clickable="true" + android:text="排序方式" + app:chipIcon="@drawable/ic_arrow_drop_down" + app:chipIconVisible="true" /> - + android:gravity="center_vertical"> @@ -107,7 +117,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" app:icon="@drawable/ic_restore" - style="@style/Widget.Material3.Button.IconButton.Outlined"/> + style="@style/Widget.Material3Expressive.Button.IconButton.Outlined" /> @@ -126,7 +136,7 @@ android:id="@+id/btn_ok" android:layout_width="wrap_content" android:layout_height="wrap_content" - style="@style/Widget.Material3.Button.UnelevatedButton" + style="@style/Widget.Material3Expressive.Button" android:text="@string/ok" tools:ignore="RtlHardcoded" /> diff --git a/app/src/main/res/layout/dialog_bookmark.xml b/app/src/main/res/layout/dialog_bookmark.xml index f38e20e3a..d06979bbf 100644 --- a/app/src/main/res/layout/dialog_bookmark.xml +++ b/app/src/main/res/layout/dialog_bookmark.xml @@ -75,7 +75,7 @@ - + android:paddingBottom="8dp"> - - - - - - - - - - - - - - - - + android:layout_gravity="center_horizontal" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/dialog_check_source_config.xml b/app/src/main/res/layout/dialog_check_source_config.xml index 5fb620e6e..e55db32f9 100644 --- a/app/src/main/res/layout/dialog_check_source_config.xml +++ b/app/src/main/res/layout/dialog_check_source_config.xml @@ -6,22 +6,20 @@ android:layout_height="wrap_content" android:orientation="vertical" android:paddingHorizontal="16dp" - android:paddingVertical="8dp"> + android:paddingBottom="8dp"> - + @@ -107,7 +105,7 @@ android:id="@+id/tv_ok" android:layout_width="wrap_content" android:layout_height="wrap_content" - style="@style/Widget.Material3.Button.TonalButton" + style="@style/Widget.Material3Expressive.Button" android:text="@string/ok" tools:ignore="RtlHardcoded" /> diff --git a/app/src/main/res/layout/dialog_cover_rule_config.xml b/app/src/main/res/layout/dialog_cover_rule_config.xml index 8431397e4..b4fc72f1e 100644 --- a/app/src/main/res/layout/dialog_cover_rule_config.xml +++ b/app/src/main/res/layout/dialog_cover_rule_config.xml @@ -92,7 +92,7 @@ android:id="@+id/tv_footer_left" android:layout_width="wrap_content" android:layout_height="wrap_content" - style="@style/Widget.Material3.Button.TonalButton" + style="@style/Widget.Material3Expressive.Button.TonalButton" android:text="@string/btn_default_s" tools:ignore="RtlHardcoded" /> @@ -105,7 +105,7 @@ android:id="@+id/tv_cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" - style="@style/Widget.Material3.Button.TonalButton" + style="@style/Widget.Material3Expressive.Button.TonalButton" android:layout_marginEnd="8dp" android:text="@string/cancel" tools:ignore="RtlHardcoded" /> @@ -114,7 +114,7 @@ android:id="@+id/tv_ok" android:layout_width="wrap_content" android:layout_height="wrap_content" - style="@style/Widget.Material3.Button.TonalButton" + style="@style/Widget.Material3Expressive.Button.TonalButton" android:text="@string/ok" tools:ignore="RtlHardcoded" /> diff --git a/app/src/main/res/layout/dialog_dict.xml b/app/src/main/res/layout/dialog_dict.xml index 2d39da7f8..073eef5b4 100644 --- a/app/src/main/res/layout/dialog_dict.xml +++ b/app/src/main/res/layout/dialog_dict.xml @@ -4,9 +4,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingHorizontal="16dp" - android:paddingVertical="8dp"> + android:paddingBottom="16dp"> - - + - - - + diff --git a/app/src/main/res/layout/dialog_direct_link_upload_config.xml b/app/src/main/res/layout/dialog_direct_link_upload_config.xml index 35c77f4d1..ee1c2c51c 100644 --- a/app/src/main/res/layout/dialog_direct_link_upload_config.xml +++ b/app/src/main/res/layout/dialog_direct_link_upload_config.xml @@ -88,7 +88,7 @@ android:id="@+id/tv_footer_left" android:layout_width="wrap_content" android:layout_height="wrap_content" - style="@style/Widget.Material3.Button.TonalButton" + style="@style/Widget.Material3Expressive.Button.TonalButton" android:text="@string/test" tools:ignore="RtlHardcoded" /> @@ -101,7 +101,7 @@ android:id="@+id/tv_cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" - style="@style/Widget.Material3.Button.TonalButton" + style="@style/Widget.Material3Expressive.Button.TonalButton" android:layout_marginEnd="8dp" android:text="@string/cancel" tools:ignore="RtlHardcoded" /> @@ -110,7 +110,7 @@ android:id="@+id/tv_ok" android:layout_width="wrap_content" android:layout_height="wrap_content" - style="@style/Widget.Material3.Button.TonalButton" + style="@style/Widget.Material3Expressive.Button.TonalButton" android:text="@string/ok" tools:ignore="RtlHardcoded" /> diff --git a/app/src/main/res/layout/dialog_file_chooser.xml b/app/src/main/res/layout/dialog_file_chooser.xml index 6de2c81c6..f1b2669ef 100644 --- a/app/src/main/res/layout/dialog_file_chooser.xml +++ b/app/src/main/res/layout/dialog_file_chooser.xml @@ -41,7 +41,7 @@ android:id="@+id/tv_ok" android:layout_width="match_parent" android:layout_height="wrap_content" - style="@style/Widget.Material3.Button.TonalButton" + style="@style/Widget.Material3Expressive.Button.TonalButton" android:layout_margin="8dp" android:text="@string/ok" android:gravity="center" /> diff --git a/app/src/main/res/layout/dialog_manga_footer_setting.xml b/app/src/main/res/layout/dialog_manga_footer_setting.xml index 3d4c082ea..0e778c388 100644 --- a/app/src/main/res/layout/dialog_manga_footer_setting.xml +++ b/app/src/main/res/layout/dialog_manga_footer_setting.xml @@ -167,7 +167,7 @@ + android:paddingBottom="16dp"> + android:paddingBottom="8dp"> - + + + diff --git a/app/src/main/res/layout/dialog_open_url_confirm.xml b/app/src/main/res/layout/dialog_open_url_confirm.xml index e7f154dba..94fa242fe 100644 --- a/app/src/main/res/layout/dialog_open_url_confirm.xml +++ b/app/src/main/res/layout/dialog_open_url_confirm.xml @@ -31,7 +31,7 @@ android:id="@+id/btn_negative" android:layout_width="wrap_content" android:layout_height="wrap_content" - style="@style/Widget.Material3.Button.TonalButton" + style="@style/Widget.Material3Expressive.Button.TonalButton" android:layout_marginEnd="8dp" android:text="@string/cancel" /> @@ -39,7 +39,7 @@ android:id="@+id/btn_positive" android:layout_width="wrap_content" android:layout_height="wrap_content" - style="@style/Widget.Material3.Button.TonalButton" + style="@style/Widget.Material3Expressive.Button.TonalButton" android:text="@string/ok" /> diff --git a/app/src/main/res/layout/dialog_read_bg_text.xml b/app/src/main/res/layout/dialog_read_bg_text.xml index 279495cac..1120c642e 100644 --- a/app/src/main/res/layout/dialog_read_bg_text.xml +++ b/app/src/main/res/layout/dialog_read_bg_text.xml @@ -6,19 +6,36 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - android:padding="16dp"> + android:paddingHorizontal="16dp" + android:paddingBottom="8dp"> + android:orientation="vertical" + android:paddingHorizontal="16dp"> + + + + + + @@ -27,29 +44,74 @@ android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="4dp" - android:layout_marginEnd="8dp" - android:textSize="16sp" + android:paddingVertical="8dp" + android:textSize="22sp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/tv_name_title" tools:text="文字" /> + app:icon="@drawable/ic_edit" + app:layout_constraintBottom_toBottomOf="@id/tv_name" + app:layout_constraintEnd_toStartOf="@id/iv_delete" + app:layout_constraintTop_toTopOf="@id/tv_name" /> + + + style="@style/Widget.Material3Expressive.Button.OutlinedButton" + android:layout_height="wrap_content" + android:layout_marginEnd="8dp" + android:text="@string/restore" + app:icon="@drawable/ic_restore" + app:layout_constraintEnd_toStartOf="@id/iv_import" + app:layout_constraintTop_toBottomOf="@id/iv_edit" /> - + + + + + + app:cornerRadius="12dp" /> - - - - - - - - - - - + app:cornerRadius="12dp" /> @@ -175,6 +188,7 @@ + - + - + android:orientation="horizontal"> + - + app:iconGravity="textStart" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toEndOf="@id/bottom_sheet_title" + app:layout_constraintTop_toTopOf="parent" /> + @@ -311,6 +317,7 @@ diff --git a/app/src/main/res/layout/dialog_recycler_view.xml b/app/src/main/res/layout/dialog_recycler_view.xml index d257a1498..5ea2cbcf3 100644 --- a/app/src/main/res/layout/dialog_recycler_view.xml +++ b/app/src/main/res/layout/dialog_recycler_view.xml @@ -46,7 +46,7 @@ android:id="@+id/tv_footer_left" android:layout_width="wrap_content" android:layout_height="wrap_content" - style="@style/Widget.Material3.Button.TonalButton" + style="@style/Widget.Material3Expressive.Button.TonalButton" android:padding="12dp" android:visibility="gone" tools:ignore="RtlHardcoded" /> @@ -64,7 +64,7 @@ android:id="@+id/tv_cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" - style="@style/Widget.Material3.Button.OutlinedButton" + style="@style/Widget.Material3Expressive.Button.OutlinedButton" android:padding="12dp" android:layout_marginEnd="8dp" android:text="@string/cancel" @@ -75,7 +75,7 @@ android:id="@+id/tv_ok" android:layout_width="wrap_content" android:layout_height="wrap_content" - style="@style/Widget.Material3.Button.UnelevatedButton" + style="@style/Widget.Material3Expressive.Button" android:padding="12dp" android:text="@string/ok" android:visibility="gone" diff --git a/app/src/main/res/layout/dialog_update.xml b/app/src/main/res/layout/dialog_update.xml index 5ce954e40..838fc62be 100644 --- a/app/src/main/res/layout/dialog_update.xml +++ b/app/src/main/res/layout/dialog_update.xml @@ -73,7 +73,7 @@ android:layout_height="wrap_content" android:textAppearance="?attr/textAppearanceBodyMedium" android:padding="8dp" - android:text="123"/> + android:text="@string/text" /> + android:text="@string/text" /> @@ -138,7 +138,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="8dp" - android:text="123" + android:text="@string/text" android:textAppearance="?attr/textAppearanceBodyMedium" /> diff --git a/app/src/main/res/layout/item_arrange_book.xml b/app/src/main/res/layout/item_arrange_book.xml index c3c09cbf3..3fc51396e 100644 --- a/app/src/main/res/layout/item_arrange_book.xml +++ b/app/src/main/res/layout/item_arrange_book.xml @@ -66,7 +66,7 @@ android:id="@+id/tv_group" android:layout_width="48dp" android:layout_height="40dp" - style="@style/Widget.Material3.Button.TonalButton" + style="@style/Widget.Material3Expressive.Button.TonalButton" android:textSize="12sp" android:layout_marginEnd="8dp" android:padding="0dp" diff --git a/app/src/main/res/layout/item_bg_image.xml b/app/src/main/res/layout/item_bg_image.xml index 4bf9cf5fe..b22ed8cc2 100644 --- a/app/src/main/res/layout/item_bg_image.xml +++ b/app/src/main/res/layout/item_bg_image.xml @@ -3,22 +3,30 @@ android:layout_width="66dp" android:layout_height="88dp" xmlns:tool="http://schemas.android.com/tools" - android:padding="2dp" + android:layout_marginEnd="6dp" android:orientation="vertical"> - + android:layout_weight="1"> + + + + diff --git a/app/src/main/res/layout/item_book_group_manage.xml b/app/src/main/res/layout/item_book_group_manage.xml index a4780724d..6e48394d8 100644 --- a/app/src/main/res/layout/item_book_group_manage.xml +++ b/app/src/main/res/layout/item_book_group_manage.xml @@ -20,7 +20,7 @@ android:layout_width="48dp" android:layout_height="48dp" android:layout_marginEnd="8dp" - style="@style/Widget.Material3.Button.IconButton.Filled.Tonal" + style="@style/Widget.Material3Expressive.Button.IconButton.Tonal" app:icon="@drawable/ic_edit" /> - - diff --git a/app/src/main/res/layout/item_bookshelf_grid.xml b/app/src/main/res/layout/item_bookshelf_grid.xml index f064ca712..bc98966f5 100644 --- a/app/src/main/res/layout/item_bookshelf_grid.xml +++ b/app/src/main/res/layout/item_bookshelf_grid.xml @@ -10,7 +10,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="4dp" - android:foreground="?attr/selectableItemBackground" android:clickable="true" android:focusable="true" app:strokeWidth="0dp" diff --git a/app/src/main/res/layout/item_bookshelf_list.xml b/app/src/main/res/layout/item_bookshelf_list.xml index 0234b2dbc..3715fca09 100644 --- a/app/src/main/res/layout/item_bookshelf_list.xml +++ b/app/src/main/res/layout/item_bookshelf_list.xml @@ -129,7 +129,7 @@ android:maxLines="1" android:scrollbars="none" android:singleLine="true" - android:text="123" + android:text="@string/text" android:textSize="13sp" app:layout_constraintBottom_toBottomOf="@+id/tv_author" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/item_download.xml b/app/src/main/res/layout/item_download.xml index 5f6733c85..07c8c174e 100644 --- a/app/src/main/res/layout/item_download.xml +++ b/app/src/main/res/layout/item_download.xml @@ -53,7 +53,7 @@ android:id="@+id/tv_export" android:layout_width="48dp" android:layout_height="40dp" - style="@style/Widget.Material3.Button.TonalButton" + style="@style/Widget.Material3Expressive.Button.TonalButton" android:textSize="12sp" android:padding="0dp" android:text="@string/export" diff --git a/app/src/main/res/layout/item_read_style.xml b/app/src/main/res/layout/item_read_style.xml index 534084196..c7c3fe650 100644 --- a/app/src/main/res/layout/item_read_style.xml +++ b/app/src/main/res/layout/item_read_style.xml @@ -1,11 +1,38 @@ - \ No newline at end of file + android:id="@+id/rv_style" + android:layout_width="64dp" + android:layout_height="72dp" + android:layout_marginLeft="4dp" + android:layout_marginRight="4dp" + app:cardBackgroundColor="@android:color/transparent" + app:strokeWidth="0dp"> + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_search.xml b/app/src/main/res/layout/item_search.xml index 15933d7a9..402317f8b 100644 --- a/app/src/main/res/layout/item_search.xml +++ b/app/src/main/res/layout/item_search.xml @@ -3,21 +3,56 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" + xmlns:app="http://schemas.android.com/apk/res-auto" android:padding="16dp" android:background="?attr/selectableItemBackground" android:orientation="horizontal" android:scrollbars="none"> - + + + + + + + + + + + + - - - + diff --git a/app/src/main/res/layout/view_manga_menu.xml b/app/src/main/res/layout/view_manga_menu.xml index 211be1836..35bea83ae 100644 --- a/app/src/main/res/layout/view_manga_menu.xml +++ b/app/src/main/res/layout/view_manga_menu.xml @@ -89,7 +89,7 @@ android:id="@+id/tv_pre" android:layout_width="wrap_content" android:layout_height="wrap_content" - style="@style/Widget.Material3.Button.IconButton.Filled.Tonal" + style="@style/Widget.Material3Expressive.Button.IconButton.Tonal" app:icon="@drawable/ic_previous" tools:ignore="TouchTargetSizeCheck" /> @@ -112,7 +112,7 @@ android:id="@+id/tv_next" android:layout_width="wrap_content" android:layout_height="wrap_content" - style="@style/Widget.Material3.Button.IconButton.Filled.Tonal" + style="@style/Widget.Material3Expressive.Button.IconButton.Tonal" app:icon="@drawable/ic_next" tools:ignore="TouchTargetSizeCheck" /> @@ -127,12 +127,19 @@ android:paddingHorizontal="16dp" android:paddingVertical="8dp"> + + + + diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index f5ab9bbaa..ade154441 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -802,7 +802,7 @@ 自动清除过期搜索数据 超过一天的搜索数据 重新分段 - 样式名称: + 样式名称 点击右上角文件夹图标,选择文件夹 智能扫描 导入文件名 @@ -1230,5 +1230,9 @@ 阈值 禁用水平滚动动画 开启图片灰色 + 排列视图 + 列表 + 网格 + 降序 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 59a3aef5c..aac668bf1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1231,5 +1231,11 @@ 阈值 禁用水平滚动动画 开启图片灰色 + 排列视图 + 列表 + 网格 + 每行列数 + 升序 + 降序 diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index cfab4257b..5f83ceef5 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -2,72 +2,12 @@ //**************************************************************Theme******************************************************************************// - - - - + + +