修复详情页书籍简介下部分被裁剪,更新界面

This commit is contained in:
HapeLee committed 2025-09-06 14:45:38 +08:00
1 parent 56bd980834
commit 3e123ab73c
3 files changed
+131 -83

No files matched your search

@@ -160,9 +160,12 @@ class BookInfoActivity :
} }
private var surfaceFinalColor: Int = 0 private var surfaceFinalColor: Int = 0
private var surfaceContainerFinalColor: Int = 0
private var secondaryFinalColor: Int = 0 private var secondaryFinalColor: Int = 0
private var onSurfaceFinalColor: Int = 0 private var onSurfaceFinalColor: Int = 0
private var secondaryContainerFinalColor: Int = 0 private var secondaryContainerFinalColor: Int = 0
private var primaryFinalColor: Int = 0
private var tertiaryFinalColor: Int = 0
private var currentJob: Job? = null private var currentJob: Job? = null
private var wrappedContext: Context? = null private var wrappedContext: Context? = null
private var chapterChanged = false private var chapterChanged = false
@@ -190,17 +193,38 @@ class BookInfoActivity :
MaterialColors.getColor(this, com.google.android.material.R.attr.colorSecondary, -1) MaterialColors.getColor(this, com.google.android.material.R.attr.colorSecondary, -1)
onSurfaceFinalColor = onSurfaceFinalColor =
MaterialColors.getColor(this, com.google.android.material.R.attr.colorOnSurface, -1) MaterialColors.getColor(this, com.google.android.material.R.attr.colorOnSurface, -1)
surfaceContainerFinalColor = MaterialColors.getColor(
this,
com.google.android.material.R.attr.colorSurfaceContainer,
-1
)
secondaryContainerFinalColor = MaterialColors.getColor( secondaryContainerFinalColor = MaterialColors.getColor(
this, this,
com.google.android.material.R.attr.colorSecondaryContainer, com.google.android.material.R.attr.colorSecondaryContainer,
-1 -1
) )
primaryFinalColor = MaterialColors.getColor(
this,
androidx.appcompat.R.attr.colorPrimary,
-1
)
tertiaryFinalColor = MaterialColors.getColor(
this,
com.google.android.material.R.attr.colorTertiary,
-1
)
binding.cdCov.transitionName = intent.getStringExtra("transitionName") binding.cdCov.transitionName = intent.getStringExtra("transitionName")
binding.cdCov.doOnPreDraw { binding.cdCov.doOnPreDraw {
startPostponedEnterTransition() startPostponedEnterTransition()
} }
setSupportActionBar(binding.topBar) setSupportActionBar(binding.topBar)
binding.llRead?.applyNavigationBarMargin()
binding.scrollView.setOnScrollChangeListener { _, _, scrollY, _, oldScrollY ->
if (scrollY > oldScrollY) binding.btnRead.shrink()
else if (scrollY < oldScrollY) binding.btnRead.extend()
}
binding.btnRead.applyNavigationBarMargin()
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))
@@ -480,7 +504,8 @@ class BookInfoActivity :
private suspend fun applyColorScheme() { private suspend fun applyColorScheme() {
val ctx = wrappedContext ?: this val ctx = wrappedContext ?: this
val colorPrimary = MaterialColors.getColor(ctx, androidx.appcompat.R.attr.colorPrimary, -1) val colorPrimary =
MaterialColors.getColor(ctx, androidx.appcompat.R.attr.colorPrimary, -1)
val colorSecondary = val colorSecondary =
MaterialColors.getColor(ctx, com.google.android.material.R.attr.colorSecondary, -1) MaterialColors.getColor(ctx, com.google.android.material.R.attr.colorSecondary, -1)
val colorTertiary = val colorTertiary =
@@ -489,16 +514,18 @@ class BookInfoActivity :
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.colorSurfaceContainerHighest,
) -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 surfaceTransition = ValueAnimator.ofArgb(surfaceFinalColor, colorSurface).apply { val surfaceTransition = ValueAnimator.ofArgb(surfaceFinalColor, colorSurface).apply {
duration = 400L duration = 400L
@@ -506,9 +533,21 @@ class BookInfoActivity :
val color = animation.animatedValue as Int val color = animation.animatedValue as Int
binding.cdInfo?.setCardBackgroundColor(color) binding.cdInfo?.setCardBackgroundColor(color)
binding.llInfo.setBackgroundColor(color) binding.llInfo.setBackgroundColor(color)
(binding.llCover.background as? GradientDrawable)?.colors =
intArrayOf(Color.TRANSPARENT, color)
} }
} }
val surfaceContainerTransition =
ValueAnimator.ofArgb(surfaceContainerFinalColor, colorSurfaceContainer).apply {
duration = 400L
addUpdateListener { animation ->
val color = animation.animatedValue as Int
binding.lbKind.applyColorScheme(color, colorOnSurface)
binding.collTopBar.setContentScrimColor(color)
}
}
val buttonTransition = ValueAnimator.ofArgb(secondaryFinalColor, colorSecondary).apply { val buttonTransition = ValueAnimator.ofArgb(secondaryFinalColor, colorSecondary).apply {
duration = 400L duration = 400L
addUpdateListener { animation -> addUpdateListener { animation ->
@@ -523,6 +562,8 @@ class BookInfoActivity :
btn.setTextColor(color) btn.setTextColor(color)
btn.iconTint = tint btn.iconTint = tint
} }
binding.div.setTextColor(color)
binding.tvChapterIndex.setTextColor(color)
} }
} }
@@ -543,33 +584,48 @@ class BookInfoActivity :
binding.tvAuthor.setTextColor(color) binding.tvAuthor.setTextColor(color)
binding.tvOrigin.setTextColor(color) binding.tvOrigin.setTextColor(color)
binding.tvDetail.setTextColor(color) binding.tvDetail.setTextColor(color)
binding.tvToc.setTextColor(color)
binding.tvLasted.setTextColor(color)
binding.ivName.imageTintList = ColorStateList.valueOf(color) binding.ivName.imageTintList = ColorStateList.valueOf(color)
binding.ivWeb.imageTintList = ColorStateList.valueOf(color) binding.ivWeb.imageTintList = ColorStateList.valueOf(color)
} }
} }
val primaryTransition = ValueAnimator.ofArgb(primaryFinalColor, colorPrimary).apply {
duration = 400L
addUpdateListener { animation ->
val color = animation.animatedValue as Int
binding.tvChapter.setTextColor(color)
}
}
val tertiaryTransition = ValueAnimator.ofArgb(tertiaryFinalColor, colorTertiary).apply {
duration = 400L
addUpdateListener { animation ->
val color = animation.animatedValue as Int
binding.btnRead.setBackgroundColor(color)
}
}
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
surfaceTransition.start() listOf(
buttonTransition.start() surfaceTransition,
textTransition.start() surfaceContainerTransition,
backTransition.start() buttonTransition,
backTransition,
textTransition,
primaryTransition,
tertiaryTransition
).forEach { it.start() }
} }
surfaceFinalColor = colorSurface surfaceFinalColor = colorSurface
secondaryFinalColor = colorSecondary secondaryFinalColor = colorSecondary
onSurfaceFinalColor = colorOnSurface onSurfaceFinalColor = colorOnSurface
surfaceContainerFinalColor = colorSurfaceContainer
(binding.llCover.background as? GradientDrawable)?.colors = primaryFinalColor = colorPrimary
intArrayOf(Color.TRANSPARENT, colorSurface) tertiaryFinalColor = colorTertiary
secondaryContainerFinalColor = colorSecondaryContainer
binding.collTopBar.setContentScrimColor(colorSurfaceContainer)
binding.lbKind.applyColorScheme(colorSurfaceContainer, colorOnSurface)
binding.tvChapter.setTextColor(colorPrimary)
binding.div.setTextColor(colorSecondary)
binding.tvChapterIndex.setTextColor(colorSecondary)
binding.btnRead.setBackgroundColor(colorTertiary)
binding.tvToc.setTextColor(colorOnSurface)
binding.tvLasted.setTextColor(colorOnSurface)
} }
private fun upLoading(isLoading: Boolean, chapterList: List<BookChapter>? = null) { private fun upLoading(isLoading: Boolean, chapterList: List<BookChapter>? = null) {
@@ -38,7 +38,7 @@ class LabelsBar @JvmOverloads constructor(
chipEndPadding = 8f chipEndPadding = 8f
chipStrokeWidth = 0f chipStrokeWidth = 0f
chipBackgroundColor = ColorStateList.valueOf( chipBackgroundColor = ColorStateList.valueOf(
context.themeColor(com.google.android.material.R.attr.colorPrimaryContainer) context.themeColor(com.google.android.material.R.attr.colorSurfaceContainerHighest)
) )
usedChips.add(this) usedChips.add(this)
} }
+46 -54
View File
@@ -50,23 +50,21 @@
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/refresh_layout" android:id="@+id/refresh_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior"> app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView
android:id="@+id/scroll_view" android:id="@+id/scroll_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:fillViewport="true" android:fillViewport="true"
android:fitsSystemWindows="false" android:fitsSystemWindows="false"
android:focusable="true" android:focusable="true"
android:padding="0dp"
android:scrollbarStyle="outsideOverlay"
android:scrollbars="vertical"> android:scrollbars="vertical">
<androidx.constraintlayout.widget.ConstraintLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
@@ -74,8 +72,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/bg_gradient_mask" android:background="@drawable/bg_gradient_mask"
android:paddingHorizontal="16dp" android:paddingTop="8dp"
android:paddingVertical="8dp" android:paddingBottom="4dp"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.card.MaterialCardView <com.google.android.material.card.MaterialCardView
@@ -83,11 +81,11 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
app:cardCornerRadius="8dp" app:cardCornerRadius="8dp"
app:layout_constraintBottom_toBottomOf="parent" android:layout_marginStart="16dp"
app:layout_constraintDimensionRatio="5:7" app:layout_constraintDimensionRatio="5:7"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_percent="0.32" app:layout_constraintWidth_percent="0.3"
app:strokeWidth="0dp"> app:strokeWidth="0dp">
<io.legato.kazusa.ui.widget.image.CoverImageView <io.legato.kazusa.ui.widget.image.CoverImageView
@@ -105,6 +103,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:orientation="vertical" android:orientation="vertical"
android:layout_marginEnd="16dp"
android:padding="12dp" android:padding="12dp"
app:layout_constraintBottom_toBottomOf="@id/cd_cov" app:layout_constraintBottom_toBottomOf="@id/cd_cov"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
@@ -182,24 +181,15 @@
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/ll_info"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="?attr/colorSurface"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/ll_cover">
<HorizontalScrollView <HorizontalScrollView
android:id="@+id/scroll_labels" android:id="@+id/scroll_labels"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingStart="16dp" android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:scrollbars="none" android:scrollbars="none"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/cd_cov">
<io.legato.kazusa.ui.widget.LabelsBar <io.legato.kazusa.ui.widget.LabelsBar
android:id="@+id/lb_kind" android:id="@+id/lb_kind"
@@ -209,6 +199,17 @@
</HorizontalScrollView> </HorizontalScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/ll_info"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="?attr/colorSurface"
android:orientation="vertical"
app:layout_constraintTop_toBottomOf="@id/ll_cover">
<LinearLayout <LinearLayout
android:id="@+id/cl_buttons" android:id="@+id/cl_buttons"
android:layout_width="match_parent" android:layout_width="match_parent"
@@ -217,7 +218,7 @@
android:gravity="center_vertical" android:gravity="center_vertical"
android:orientation="horizontal" android:orientation="horizontal"
android:weightSum="4" android:weightSum="4"
app:layout_constraintTop_toBottomOf="@id/scroll_labels"> app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/btn_shelf" android:id="@+id/btn_shelf"
@@ -287,8 +288,8 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp" android:layout_marginHorizontal="16dp"
android:layout_marginTop="8dp" android:layout_marginTop="4dp"
android:textSize="16sp" android:textSize="17sp"
android:textStyle="bold" android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@@ -300,7 +301,7 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp" android:layout_marginHorizontal="16dp"
android:layout_marginTop="8dp" android:layout_marginTop="4dp"
android:singleLine="true" android:singleLine="true"
android:textSize="14sp" android:textSize="14sp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
@@ -314,7 +315,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp" android:layout_marginStart="16dp"
android:layout_marginTop="8dp" android:layout_marginTop="4dp"
android:singleLine="true" android:singleLine="true"
android:textColor="?attr/colorPrimary" android:textColor="?attr/colorPrimary"
android:textSize="14sp" android:textSize="14sp"
@@ -350,50 +351,41 @@
<TextView <TextView
android:id="@+id/tv_detail" android:id="@+id/tv_detail"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp" android:layout_marginHorizontal="16dp"
android:layout_marginTop="8dp" android:layout_marginTop="16dp"
android:paddingBottom="120dp"
android:clickable="true" android:clickable="true"
android:focusable="true" android:focusable="true"
android:lineSpacingExtra="4dp" android:lineSpacingExtra="4dp"
android:minHeight="48dp"
android:paddingBottom="120dp"
android:text="@string/book_intro" android:text="@string/book_intro"
android:textIsSelectable="true" android:textIsSelectable="true"
android:textSize="14sp" android:textSize="14sp"
android:visibility="visible" android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_chapter" app:layout_constraintTop_toBottomOf="@id/tv_chapter"
tools:text="@string/book_intro" /> tools:text="@string/book_intro" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </LinearLayout>
</androidx.core.widget.NestedScrollView> </androidx.core.widget.NestedScrollView>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout> </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<LinearLayout <com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
android:id="@+id/ll_read" android:id="@+id/btn_read"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom" android:layout_margin="16dp"
android:gravity="end" android:contentDescription="@string/reading"
android:orientation="horizontal"> android:minWidth="56dp"
android:text="@string/reading"
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton android:textColor="?attr/colorOnPrimary"
android:id="@+id/btn_read" app:backgroundTint="?attr/colorTertiary"
android:layout_width="wrap_content" app:icon="@drawable/ic_bottom_books"
android:layout_height="wrap_content" app:iconTint="?attr/colorOnPrimary"
android:layout_margin="16dp" app:layout_anchor="@id/refresh_layout"
android:contentDescription="@string/reading" app:layout_anchorGravity="bottom|end" />
android:minWidth="56dp"
android:text="@string/reading"
android:textColor="?attr/colorOnPrimary"
app:backgroundTint="?attr/colorTertiary"
app:icon="@drawable/ic_bottom_books"
app:iconTint="?attr/colorOnPrimary" />
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>