优化界面显示

This commit is contained in:
HapeLee committed 2025-09-07 02:40:46 +08:00
1 parent 3e123ab73c
commit 66fefe1253
9 files changed
+107 -65

No files matched your search

@@ -51,6 +51,7 @@ import io.legato.kazusa.ui.book.source.edit.BookSourceEditActivity
import io.legato.kazusa.ui.book.toc.TocActivityResult import io.legato.kazusa.ui.book.toc.TocActivityResult
import io.legato.kazusa.ui.login.SourceLoginActivity import io.legato.kazusa.ui.login.SourceLoginActivity
import io.legato.kazusa.utils.StartActivityContract import io.legato.kazusa.utils.StartActivityContract
import io.legato.kazusa.utils.ToolbarUtils.setAllIconsColor
import io.legato.kazusa.utils.applyNavigationBarPadding import io.legato.kazusa.utils.applyNavigationBarPadding
import io.legato.kazusa.utils.gone import io.legato.kazusa.utils.gone
import io.legato.kazusa.utils.observeEvent import io.legato.kazusa.utils.observeEvent
@@ -437,16 +438,24 @@ class AudioPlayActivity :
MaterialColors.getColor(ctx, com.google.android.material.R.attr.colorOnSurface, -1) MaterialColors.getColor(ctx, com.google.android.material.R.attr.colorOnSurface, -1)
val colorSurface = val colorSurface =
MaterialColors.getColor(ctx, com.google.android.material.R.attr.colorSurface, -1) MaterialColors.getColor(ctx, com.google.android.material.R.attr.colorSurface, -1)
val colorSurfaceContainer = MaterialColors.getColor( val colorSurfaceContainer =
ctx, MaterialColors.getColor(
com.google.android.material.R.attr.colorSurfaceContainer, ctx,
-1 com.google.android.material.R.attr.colorSurfaceContainer,
) -1
val colorSecondaryContainer = MaterialColors.getColor( )
ctx, val colorSecondaryContainer =
com.google.android.material.R.attr.colorSecondaryContainer, MaterialColors.getColor(
-1 ctx,
) com.google.android.material.R.attr.colorSecondaryContainer,
-1
)
val colorOnSurfaceVariant =
MaterialColors.getColor(
ctx,
com.google.android.material.R.attr.colorOnSurfaceVariant,
-1
)
val primaryTransition = ValueAnimator.ofArgb(primaryFinalColor, colorPrimary).apply { val primaryTransition = ValueAnimator.ofArgb(primaryFinalColor, colorPrimary).apply {
duration = 400L duration = 400L
@@ -456,6 +465,8 @@ class AudioPlayActivity :
binding.settingSlider.trackActiveTintList = ColorStateList.valueOf(color) binding.settingSlider.trackActiveTintList = ColorStateList.valueOf(color)
binding.playerProgress.thumbTintList = ColorStateList.valueOf(color) binding.playerProgress.thumbTintList = ColorStateList.valueOf(color)
binding.playerProgress.trackActiveTintList = ColorStateList.valueOf(color) binding.playerProgress.trackActiveTintList = ColorStateList.valueOf(color)
binding.tvDurTime.setTextColor(color)
binding.tvAllTime.setTextColor(color)
} }
} }
@@ -477,8 +488,6 @@ class AudioPlayActivity :
addUpdateListener { animation -> addUpdateListener { animation ->
val color = animation.animatedValue as Int val color = animation.animatedValue as Int
binding.vwBg2.setBackgroundColor(color) binding.vwBg2.setBackgroundColor(color)
binding.cdTimer.setBackgroundColor(color)
binding.cdSpeed.setBackgroundColor(color)
} }
} }
@@ -486,12 +495,7 @@ class AudioPlayActivity :
duration = 400L duration = 400L
addUpdateListener { animation -> addUpdateListener { animation ->
val color = animation.animatedValue as Int val color = animation.animatedValue as Int
binding.tvSpeed.setTextColor(color)
binding.tvTimer.setTextColor(color)
binding.tvTitle.setTextColor(color) binding.tvTitle.setTextColor(color)
binding.tvDurTime.setTextColor(color)
binding.tvAllTime.setTextColor(color)
binding.tvSubTitle.setTextColor(color)
} }
} }
@@ -508,7 +512,18 @@ class AudioPlayActivity :
primaryFinalColor = colorPrimary primaryFinalColor = colorPrimary
secondaryContainerFinalColor = colorSecondaryContainer secondaryContainerFinalColor = colorSecondaryContainer
binding.titleBar.toolbar.setAllIconsColor(colorOnSurface)
binding.progressLoading.setIndicatorColor(colorPrimary) binding.progressLoading.setIndicatorColor(colorPrimary)
binding.settingSlider.tickActiveTintList = ColorStateList.valueOf(colorSurface)
binding.settingSlider.tickInactiveTintList = ColorStateList.valueOf(colorPrimary)
binding.tvSubTitle.setTextColor(colorOnSurfaceVariant)
binding.btnTimer.imageTintList = ColorStateList.valueOf(colorOnSurface)
binding.tvSpeed.setTextColor(colorOnSurface)
binding.tvTimer.setTextColor(colorOnSurface)
binding.cdTimer.setCardBackgroundColor(colorSurfaceContainer)
binding.cdSpeed.setCardBackgroundColor(colorSurfaceContainer)
val states = arrayOf( val states = arrayOf(
intArrayOf(android.R.attr.state_enabled, android.R.attr.state_checked), intArrayOf(android.R.attr.state_enabled, android.R.attr.state_checked),
@@ -74,6 +74,7 @@ import io.legato.kazusa.utils.ConvertUtils
import io.legato.kazusa.utils.FileDoc import io.legato.kazusa.utils.FileDoc
import io.legato.kazusa.utils.GSON import io.legato.kazusa.utils.GSON
import io.legato.kazusa.utils.StartActivityContract import io.legato.kazusa.utils.StartActivityContract
import io.legato.kazusa.utils.ToolbarUtils.setAllIconsColor
import io.legato.kazusa.utils.applyNavigationBarMargin import io.legato.kazusa.utils.applyNavigationBarMargin
import io.legato.kazusa.utils.dpToPx import io.legato.kazusa.utils.dpToPx
import io.legato.kazusa.utils.gone import io.legato.kazusa.utils.gone
@@ -224,7 +225,7 @@ class BookInfoActivity :
else if (scrollY < oldScrollY) binding.btnRead.extend() else if (scrollY < oldScrollY) binding.btnRead.extend()
} }
binding.btnRead.applyNavigationBarMargin() binding.btnRead.applyNavigationBarMargin(true)
binding.btnShelf.text = getString(R.string.remove_from_bookshelf) binding.btnShelf.text = getString(R.string.remove_from_bookshelf)
binding.tvToc.text = getString(R.string.toc_s, getString(R.string.loading)) binding.tvToc.text = getString(R.string.toc_s, getString(R.string.loading))
@@ -526,6 +527,8 @@ class BookInfoActivity :
com.google.android.material.R.attr.colorSecondaryContainer, com.google.android.material.R.attr.colorSecondaryContainer,
-1 -1
) )
val colorOnTertiary =
MaterialColors.getColor(ctx, com.google.android.material.R.attr.colorOnTertiary, -1)
val surfaceTransition = ValueAnimator.ofArgb(surfaceFinalColor, colorSurface).apply { val surfaceTransition = ValueAnimator.ofArgb(surfaceFinalColor, colorSurface).apply {
duration = 400L duration = 400L
@@ -626,6 +629,10 @@ class BookInfoActivity :
primaryFinalColor = colorPrimary primaryFinalColor = colorPrimary
tertiaryFinalColor = colorTertiary tertiaryFinalColor = colorTertiary
secondaryContainerFinalColor = colorSecondaryContainer secondaryContainerFinalColor = colorSecondaryContainer
binding.topBar.setAllIconsColor(colorOnSurface)
binding.btnRead.setTextColor(colorOnTertiary)
binding.btnRead.iconTint = ColorStateList.valueOf(colorOnTertiary)
} }
private fun upLoading(isLoading: Boolean, chapterList: List<BookChapter>? = null) { private fun upLoading(isLoading: Boolean, chapterList: List<BookChapter>? = null) {
@@ -52,14 +52,14 @@ class LabelsBar @JvmOverloads constructor(
addView(chip) addView(chip)
} }
fun applyColorScheme(colorPrimaryContainer: Int, colorOnPrimaryContainer: Int) { fun applyColorScheme(backgroundColor: Int, textColor: Int) {
usedChips.forEach { chip -> usedChips.forEach { chip ->
chip.chipBackgroundColor = ColorStateList.valueOf(colorPrimaryContainer) chip.chipBackgroundColor = ColorStateList.valueOf(backgroundColor)
chip.setTextColor(colorOnPrimaryContainer) chip.setTextColor(textColor)
} }
unUsedChips.forEach { chip -> unUsedChips.forEach { chip ->
chip.chipBackgroundColor = ColorStateList.valueOf(colorPrimaryContainer) chip.chipBackgroundColor = ColorStateList.valueOf(backgroundColor)
chip.setTextColor(colorOnPrimaryContainer) chip.setTextColor(textColor)
} }
} }
@@ -5,12 +5,10 @@ import android.content.res.ColorStateList
import android.util.AttributeSet import android.util.AttributeSet
import android.view.Menu import android.view.Menu
import android.view.View import android.view.View
import androidx.appcompat.widget.Toolbar
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.appbar.MaterialToolbar
import io.legato.kazusa.R import io.legato.kazusa.R
import io.legato.kazusa.help.config.AppConfig
//import io.legado.app.lib.theme.primaryColor
import io.legato.kazusa.utils.activity import io.legato.kazusa.utils.activity
import io.legato.kazusa.utils.setOnApplyWindowInsetsListenerCompat import io.legato.kazusa.utils.setOnApplyWindowInsetsListenerCompat
import splitties.views.bottomPadding import splitties.views.bottomPadding
@@ -22,7 +20,7 @@ class TitleBar @JvmOverloads constructor(
attrs: AttributeSet? = null attrs: AttributeSet? = null
) : AppBarLayout(context, attrs) { ) : AppBarLayout(context, attrs) {
val toolbar: Toolbar val toolbar: MaterialToolbar
val menu: Menu val menu: Menu
get() = toolbar.menu get() = toolbar.menu
@@ -1,23 +0,0 @@
@file:Suppress("unused")
package io.legato.kazusa.utils
import android.annotation.SuppressLint
import android.graphics.PorterDuff
import android.graphics.PorterDuffColorFilter
import android.os.Build
import android.widget.Toolbar
import androidx.core.content.ContextCompat
import io.legato.kazusa.R
/**
* 设置toolBar更多图标颜色
*/
@SuppressLint("ObsoleteSdkInt")
fun Toolbar.setMoreIconColor(color: Int) {
val moreIcon = ContextCompat.getDrawable(context, R.drawable.ic_more)
if (moreIcon != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
moreIcon.colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP)
overflowIcon = moreIcon
}
}
@@ -0,0 +1,37 @@
package io.legato.kazusa.utils
import android.annotation.SuppressLint
import android.graphics.PorterDuff
import android.graphics.PorterDuffColorFilter
import android.os.Build
import androidx.annotation.ColorInt
import androidx.core.content.ContextCompat
import androidx.core.view.get
import androidx.core.view.size
import com.google.android.material.appbar.MaterialToolbar
import io.legato.kazusa.R
object ToolbarUtils {
@JvmStatic
fun MaterialToolbar.setAllIconsColor(@ColorInt color: Int) {
// 导航图标
navigationIcon?.setTint(color)
// 溢出图标
overflowIcon = overflowIcon?.apply { setTint(color) }
// 菜单项图标
for (i in 0 until menu.size) {
menu[i].icon?.setTint(color)
}
}
@SuppressLint("ObsoleteSdkInt")
fun MaterialToolbar.setMoreIconColor(color: Int) {
val moreIcon = ContextCompat.getDrawable(context, R.drawable.ic_more)
if (moreIcon != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
moreIcon.colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP)
overflowIcon = moreIcon
}
}
}
@@ -28,11 +28,13 @@ import androidx.annotation.DrawableRes
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.menu.MenuPopupHelper import androidx.appcompat.view.menu.MenuPopupHelper
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
import androidx.core.graphics.createBitmap
import androidx.core.graphics.record import androidx.core.graphics.record
import androidx.core.graphics.withTranslation import androidx.core.graphics.withTranslation
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.get import androidx.core.view.get
import androidx.core.view.isVisible
import androidx.core.view.marginBottom import androidx.core.view.marginBottom
import androidx.core.view.updateLayoutParams import androidx.core.view.updateLayoutParams
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
@@ -146,7 +148,7 @@ fun View.visible() {
fun View.visible(visible: Boolean) { fun View.visible(visible: Boolean) {
if (visible && visibility != VISIBLE) { if (visible && visibility != VISIBLE) {
visibility = VISIBLE visibility = VISIBLE
} else if (!visible && visibility == VISIBLE) { } else if (!visible && isVisible) {
visibility = INVISIBLE visibility = INVISIBLE
} }
} }
@@ -158,7 +160,7 @@ fun View.screenshot(bitmap: Bitmap? = null, canvas: Canvas? = null): Bitmap? {
bitmap bitmap
} else { } else {
bitmap?.recycle() bitmap?.recycle()
Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) createBitmap(width, height)
} }
val c = canvas ?: Canvas() val c = canvas ?: Canvas()
c.setBitmap(screenshot) c.setBitmap(screenshot)
@@ -302,8 +304,8 @@ fun View.canScroll(direction: Int): Boolean {
return canScrollVertically(direction) || canScrollHorizontally(direction) return canScrollVertically(direction) || canScrollHorizontally(direction)
} }
private val requestLayoutBroken = false private val requestLayoutBroken =
|| Build.VERSION.SDK_INT in Build.VERSION_CODES.O..Build.VERSION_CODES.Q Build.VERSION.SDK_INT in Build.VERSION_CODES.O..Build.VERSION_CODES.Q
fun View.setOnApplyWindowInsetsListenerCompat(listener: (View, WindowInsetsCompat) -> WindowInsetsCompat) { fun View.setOnApplyWindowInsetsListenerCompat(listener: (View, WindowInsetsCompat) -> WindowInsetsCompat) {
ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets -> ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
@@ -18,21 +18,22 @@
android:id="@+id/vw_bg2" android:id="@+id/vw_bg2"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:alpha="0.70" android:alpha="0.80"
android:background="?attr/colorSurfaceContainer" /> android:background="?attr/colorSurfaceContainer" />
<io.legato.kazusa.ui.widget.TitleBar <io.legato.kazusa.ui.widget.TitleBar
android:id="@+id/title_bar" android:id="@+id/title_bar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent" />
app:themeMode="dark" />
<com.google.android.material.card.MaterialCardView <com.google.android.material.card.MaterialCardView
android:id="@+id/cd_cover" android:id="@+id/cd_cover"
android:layout_width="wrap_content" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="0dp"
app:cardElevation="16dp" app:cardElevation="16dp"
android:layout_marginHorizontal="44dp"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintBottom_toTopOf="@+id/tv_title" app:layout_constraintBottom_toTopOf="@+id/tv_title"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@@ -41,8 +42,8 @@
<ImageView <ImageView
android:id="@+id/iv_cover" android:id="@+id/iv_cover"
android:layout_width="260dp" android:layout_width="match_parent"
android:layout_height="260dp" android:layout_height="match_parent"
android:contentDescription="@string/img_cover" android:contentDescription="@string/img_cover"
android:scaleType="centerCrop" /> android:scaleType="centerCrop" />
</com.google.android.material.card.MaterialCardView> </com.google.android.material.card.MaterialCardView>
@@ -69,6 +70,7 @@
tools:ignore="UseCompoundDrawables"> tools:ignore="UseCompoundDrawables">
<ImageView <ImageView
android:id="@+id/btn_timer"
android:layout_width="12dp" android:layout_width="12dp"
android:layout_height="12dp" android:layout_height="12dp"
android:layout_marginEnd="4dp" android:layout_marginEnd="4dp"
@@ -119,8 +121,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center" android:gravity="center"
android:scrollbars="none" android:scrollbars="none"
android:textColor="?attr/colorOnSurface" android:layout_marginBottom="4dp"
android:textSize="22sp" android:textSize="24sp"
android:textStyle="bold" android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@+id/tv_sub_title" app:layout_constraintBottom_toTopOf="@+id/tv_sub_title"
tools:text="@string/text" /> tools:text="@string/text" />
@@ -148,6 +150,7 @@
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:text="@string/text" android:text="@string/text"
android:textStyle="bold" android:textStyle="bold"
android:textColor="?attr/colorPrimary"
app:layout_constraintBottom_toTopOf="@id/ll_play_menu" app:layout_constraintBottom_toTopOf="@id/ll_play_menu"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
tools:ignore="HardcodedText,RtlSymmetry,TextContrastCheck" /> tools:ignore="HardcodedText,RtlSymmetry,TextContrastCheck" />
@@ -161,6 +164,7 @@
android:value="0" android:value="0"
android:valueFrom="0" android:valueFrom="0"
android:valueTo="1" android:valueTo="1"
app:tickColorInactive="@android:color/transparent"
app:layout_constraintBottom_toTopOf="@id/tv_all_time" app:layout_constraintBottom_toTopOf="@id/tv_all_time"
app:thumbElevation="0dp" app:thumbElevation="0dp"
app:thumbHeight="20dp" app:thumbHeight="20dp"
@@ -175,6 +179,7 @@
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:text="@string/text" android:text="@string/text"
android:textStyle="bold" android:textStyle="bold"
android:textColor="?attr/colorPrimary"
app:layout_constraintBottom_toTopOf="@id/ll_play_menu" app:layout_constraintBottom_toTopOf="@id/ll_play_menu"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
tools:ignore="HardcodedText,TextContrastCheck" /> tools:ignore="HardcodedText,TextContrastCheck" />
@@ -378,6 +383,7 @@
android:id="@+id/setting_slider" android:id="@+id/setting_slider"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:tickColorInactive="@android:color/transparent"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:value="0" android:value="0"
android:valueFrom="0" android:valueFrom="0"
@@ -380,10 +380,10 @@
android:contentDescription="@string/reading" android:contentDescription="@string/reading"
android:minWidth="56dp" android:minWidth="56dp"
android:text="@string/reading" android:text="@string/reading"
android:textColor="?attr/colorOnPrimary" android:textColor="?attr/colorOnTertiary"
app:backgroundTint="?attr/colorTertiary" app:backgroundTint="?attr/colorTertiary"
app:icon="@drawable/ic_bottom_books" app:icon="@drawable/ic_bottom_books"
app:iconTint="?attr/colorOnPrimary" app:iconTint="?attr/colorOnTertiary"
app:layout_anchor="@id/refresh_layout" app:layout_anchor="@id/refresh_layout"
app:layout_anchorGravity="bottom|end" /> app:layout_anchorGravity="bottom|end" />