From f0b2d6cf212511f26c3ab602696b4bacbdbc453f Mon Sep 17 00:00:00 2001 From: HapeLee <1321903405@qq.com> Date: Sat, 6 Sep 2025 04:23:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B9=A6=E7=B1=8D=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E7=95=8C=E9=9D=A2=E4=B8=8E=E6=9C=89=E5=A3=B0=E4=B9=A6?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E7=9A=84=E6=A0=B9=E6=8D=AE=E5=B0=81=E9=9D=A2?= =?UTF-8?q?=E7=94=9F=E6=88=90=E4=B8=BB=E9=A2=98=E8=89=B2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kazusa/ui/book/audio/AudioPlayActivity.kt | 227 +++++++++- .../kazusa/ui/book/info/BookInfoActivity.kt | 185 +++++++- .../io/legato/kazusa/ui/widget/LabelsBar.kt | 13 +- .../res/layout-land/activity_book_info.xml | 421 +++++++++--------- .../main/res/layout/activity_audio_play.xml | 9 +- .../main/res/layout/activity_book_info.xml | 359 ++++++++------- 6 files changed, 813 insertions(+), 401 deletions(-) diff --git a/app/src/main/java/io/legato/kazusa/ui/book/audio/AudioPlayActivity.kt b/app/src/main/java/io/legato/kazusa/ui/book/audio/AudioPlayActivity.kt index 5be28286e..e5f95a1df 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/audio/AudioPlayActivity.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/audio/AudioPlayActivity.kt @@ -1,8 +1,15 @@ package io.legato.kazusa.ui.book.audio +import android.animation.ValueAnimator import android.annotation.SuppressLint +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.Color import android.graphics.RenderEffect import android.graphics.Shader +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable +import android.graphics.drawable.TransitionDrawable import android.icu.text.SimpleDateFormat import android.os.Build import android.os.Bundle @@ -11,10 +18,15 @@ import android.view.Menu import android.view.MenuItem import androidx.activity.viewModels import androidx.appcompat.content.res.AppCompatResources +import androidx.core.graphics.scale import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import androidx.transition.TransitionManager +import com.google.android.material.color.DynamicColors +import com.google.android.material.color.DynamicColorsOptions +import com.google.android.material.color.MaterialColors import com.google.android.material.slider.Slider +import com.google.android.material.transition.platform.MaterialContainerTransform import io.legato.kazusa.R import io.legato.kazusa.base.VMBaseActivity import io.legato.kazusa.constant.BookType @@ -50,7 +62,10 @@ import io.legato.kazusa.utils.startActivityForBook import io.legato.kazusa.utils.startAnimation import io.legato.kazusa.utils.viewbindingdelegate.viewBinding import io.legato.kazusa.utils.visible +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import splitties.views.onLongClick @@ -70,6 +85,13 @@ class AudioPlayActivity : private var adjustProgress = false private var playMode = AudioPlay.PlayMode.LIST_END_STOP private var playSpeed = 1f + private var primaryFinalColor: Int = 0 + private var surfaceFinalColor: Int = 0 + private var secondaryFinalColor: Int = 0 + private var onSurfaceFinalColor: Int = 0 + private var secondaryContainerFinalColor: Int = 0 + private var currentJob: Job? = null + private var wrappedContext: Context? = null private val progressTimeFormat by lazy { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { @@ -95,7 +117,27 @@ class AudioPlayActivity : } override fun onCreate(savedInstanceState: Bundle?) { + val transform = MaterialContainerTransform().apply { + addTarget(binding.root) + scrimColor = Color.TRANSPARENT + } + window.sharedElementEnterTransition = transform + window.sharedElementReturnTransition = transform super.onCreate(savedInstanceState) + binding.root.transitionName = intent.getStringExtra("transitionName") + primaryFinalColor = + MaterialColors.getColor(this, androidx.appcompat.R.attr.colorPrimary, -1) + surfaceFinalColor = + MaterialColors.getColor(this, com.google.android.material.R.attr.colorSurface, -1) + secondaryFinalColor = + MaterialColors.getColor(this, com.google.android.material.R.attr.colorSecondary, -1) + onSurfaceFinalColor = + MaterialColors.getColor(this, com.google.android.material.R.attr.colorOnSurface, -1) + secondaryContainerFinalColor = MaterialColors.getColor( + this, + com.google.android.material.R.attr.colorSecondaryContainer, + -1 + ) binding.titleBar.setBackgroundResource(R.color.transparent) binding.titleBar.title = "" AudioPlay.register(this) @@ -318,25 +360,29 @@ class AudioPlayActivity : } private fun upCover(path: String?) { - BookCover.load(this, path, sourceOrigin = AudioPlay.bookSource?.bookSourceUrl) { - if (!AppConfig.isEInkMode) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - BookCover.load(this, path, sourceOrigin = AudioPlay.bookSource?.bookSourceUrl) - .into(binding.ivBg) - val blurEffect = - RenderEffect.createBlurEffect(120f, 120f, Shader.TileMode.CLAMP) - binding.ivBg.setRenderEffect(blurEffect) - } else { - // 低版本直接加载模糊图 - BookCover.loadBlur( - this, - path, - sourceOrigin = AudioPlay.bookSource?.bookSourceUrl - ) - .into(binding.ivBg) + BookCover.load( + this, path, sourceOrigin = AudioPlay.bookSource?.bookSourceUrl, + onLoadFinish = { + binding.ivCover.post { + val drawable = binding.ivCover.drawable + if (drawable != null) { + addColorScheme(drawable) + } } + }).into(binding.ivCover) + if (!AppConfig.isEInkMode) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + BookCover.load(this, path, sourceOrigin = AudioPlay.bookSource?.bookSourceUrl) + .into(binding.ivBg) + val blurEffect = RenderEffect.createBlurEffect(120f, 120f, Shader.TileMode.CLAMP) + binding.ivBg.setRenderEffect(blurEffect) + } else { + // 低版本直接加载模糊图 + BookCover.loadBlur(this, path, sourceOrigin = AudioPlay.bookSource?.bookSourceUrl) + .into(binding.ivBg) } - }.into(binding.ivCover) + } + addColorScheme(binding.ivCover.drawable) } private fun playButton() { @@ -347,6 +393,145 @@ class AudioPlayActivity : } } + private fun addColorScheme(drawable: Drawable?) { + currentJob?.cancel() + currentJob = CoroutineScope(Dispatchers.Default).launch { + val bitmap = when (drawable) { + is BitmapDrawable -> drawable.bitmap + is TransitionDrawable -> (drawable.getDrawable(1) as? BitmapDrawable)?.bitmap + else -> null + } ?: return@launch + + val colorAccuracy = true + val targetWidth = if (colorAccuracy) (bitmap.width / 4).coerceAtMost(256) else 16 + val targetHeight = if (colorAccuracy) (bitmap.height / 4).coerceAtMost(256) else 16 + val scaledBitmap = bitmap.scale(targetWidth, targetHeight, false) + + val options = DynamicColorsOptions.Builder() + .setContentBasedSource(scaledBitmap) + .build() + + wrappedContext = DynamicColors.wrapContextIfAvailable( + this@AudioPlayActivity, + options + ).apply { + resources.configuration.uiMode = + this@AudioPlayActivity.resources.configuration.uiMode + } + + withContext(Dispatchers.Main) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + applyColorScheme() + } + } + } + } + + private suspend fun applyColorScheme() { + val ctx = wrappedContext ?: this + + val colorPrimary = MaterialColors.getColor(ctx, androidx.appcompat.R.attr.colorPrimary, -1) + val colorSecondary = + MaterialColors.getColor(ctx, com.google.android.material.R.attr.colorSecondary, -1) + val colorOnSurface = + MaterialColors.getColor(ctx, com.google.android.material.R.attr.colorOnSurface, -1) + val colorSurface = + MaterialColors.getColor(ctx, com.google.android.material.R.attr.colorSurface, -1) + val colorSurfaceContainer = MaterialColors.getColor( + ctx, + com.google.android.material.R.attr.colorSurfaceContainer, + -1 + ) + val colorSecondaryContainer = MaterialColors.getColor( + ctx, + com.google.android.material.R.attr.colorSecondaryContainer, + -1 + ) + + val primaryTransition = ValueAnimator.ofArgb(primaryFinalColor, colorPrimary).apply { + duration = 400L + addUpdateListener { animation -> + val color = animation.animatedValue as Int + binding.settingSlider.thumbTintList = ColorStateList.valueOf(color) + binding.settingSlider.trackActiveTintList = ColorStateList.valueOf(color) + binding.playerProgress.thumbTintList = ColorStateList.valueOf(color) + binding.playerProgress.trackActiveTintList = ColorStateList.valueOf(color) + } + } + + val secondaryContainerTransition = + ValueAnimator.ofArgb(secondaryContainerFinalColor, colorSecondaryContainer).apply { + duration = 400L + addUpdateListener { animation -> + val color = animation.animatedValue as Int + binding.fabPlayStop.backgroundTintList = ColorStateList.valueOf(color) + binding.btnReset.backgroundTintList = ColorStateList.valueOf(color) + binding.settingSlider.trackInactiveTintList = ColorStateList.valueOf(color) + binding.playerProgress.trackInactiveTintList = ColorStateList.valueOf(color) + } + } + + val surfaceTransition = + ValueAnimator.ofArgb(surfaceFinalColor, colorSurfaceContainer).apply { + duration = 400L + addUpdateListener { animation -> + val color = animation.animatedValue as Int + binding.vwBg2.setBackgroundColor(color) + binding.cdTimer.setBackgroundColor(color) + binding.cdSpeed.setBackgroundColor(color) + } + } + + val textTransition = ValueAnimator.ofArgb(onSurfaceFinalColor, colorOnSurface).apply { + duration = 400L + addUpdateListener { animation -> + val color = animation.animatedValue as Int + binding.tvSpeed.setTextColor(color) + binding.tvTimer.setTextColor(color) + binding.tvTitle.setTextColor(color) + binding.tvDurTime.setTextColor(color) + binding.tvAllTime.setTextColor(color) + binding.tvSubTitle.setTextColor(color) + } + } + + withContext(Dispatchers.Main) { + surfaceTransition.start() + textTransition.start() + primaryTransition.start() + secondaryContainerTransition.start() + } + + surfaceFinalColor = colorSurface + secondaryFinalColor = colorSecondary + onSurfaceFinalColor = colorOnSurface + primaryFinalColor = colorPrimary + secondaryContainerFinalColor = colorSecondaryContainer + + binding.progressLoading.setIndicatorColor(colorPrimary) + + 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), + intArrayOf(-android.R.attr.state_enabled) + ) + + val colors = intArrayOf( + colorSurface, + colorOnSurface, + colorOnSurface.copy(alpha = 0.3f) + ) + + val stateList = ColorStateList(states, colors) + listOf( + binding.ivSkipNext, binding.ivSkipPrevious, binding.ivPlayMode, binding.ivTimer, + binding.ivChapter, binding.ivFastForward, binding.btnReset, binding.fabPlayStop + ).forEach { btn -> + btn.setTextColor(stateList) + btn.iconTint = stateList + } + } + override val oldBook: Book? get() = AudioPlay.book @@ -487,4 +672,10 @@ class AudioPlayActivity : } } -} \ No newline at end of file +} + +private fun Int.copy(alpha: Float): Int { + val alpha = (alpha * 255).toInt() + return (this and 0x00FFFFFF) or (alpha shl 24) +} + diff --git a/app/src/main/java/io/legato/kazusa/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legato/kazusa/ui/book/info/BookInfoActivity.kt index 44898cd77..98ad20649 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/info/BookInfoActivity.kt @@ -1,10 +1,17 @@ package io.legato.kazusa.ui.book.info +import android.animation.ValueAnimator import android.annotation.SuppressLint +import android.content.Context import android.content.Intent +import android.content.res.ColorStateList import android.graphics.Color import android.graphics.RenderEffect import android.graphics.Shader +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable +import android.graphics.drawable.GradientDrawable +import android.graphics.drawable.TransitionDrawable import android.net.Uri import android.os.Build import android.os.Bundle @@ -15,8 +22,12 @@ import android.widget.LinearLayout import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.core.content.ContextCompat +import androidx.core.graphics.scale import androidx.core.view.doOnPreDraw import androidx.lifecycle.lifecycleScope +import com.google.android.material.color.DynamicColors +import com.google.android.material.color.DynamicColorsOptions +import com.google.android.material.color.MaterialColors import com.google.android.material.transition.platform.MaterialContainerTransform import io.legato.kazusa.R import io.legato.kazusa.base.VMBaseActivity @@ -75,7 +86,10 @@ import io.legato.kazusa.utils.startActivity import io.legato.kazusa.utils.toastOnUi import io.legato.kazusa.utils.viewbindingdelegate.viewBinding import io.legato.kazusa.utils.visible +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -144,6 +158,13 @@ class BookInfoActivity : viewModel.refreshBook(book) } } + + private var surfaceFinalColor: Int = 0 + private var secondaryFinalColor: Int = 0 + private var onSurfaceFinalColor: Int = 0 + private var secondaryContainerFinalColor: Int = 0 + private var currentJob: Job? = null + private var wrappedContext: Context? = null private var chapterChanged = false private val waitDialog by lazy { WaitDialog(this) } private var editMenuItem: MenuItem? = null @@ -156,15 +177,26 @@ class BookInfoActivity : override fun onCreate(savedInstanceState: Bundle?) { postponeEnterTransition() val transform = MaterialContainerTransform().apply { - addTarget(binding.ivCover) + addTarget(binding.cdCov) scrimColor = Color.TRANSPARENT } window.sharedElementEnterTransition = transform window.sharedElementReturnTransition = transform window.sharedElementsUseOverlay = false super.onCreate(savedInstanceState) - binding.ivCover.transitionName = intent.getStringExtra("transitionName") - binding.ivCover.doOnPreDraw { + surfaceFinalColor = + MaterialColors.getColor(this, com.google.android.material.R.attr.colorSurface, -1) + secondaryFinalColor = + MaterialColors.getColor(this, com.google.android.material.R.attr.colorSecondary, -1) + onSurfaceFinalColor = + MaterialColors.getColor(this, com.google.android.material.R.attr.colorOnSurface, -1) + secondaryContainerFinalColor = MaterialColors.getColor( + this, + com.google.android.material.R.attr.colorSecondaryContainer, + -1 + ) + binding.cdCov.transitionName = intent.getStringExtra("transitionName") + binding.cdCov.doOnPreDraw { startPostponedEnterTransition() } setSupportActionBar(binding.topBar) @@ -342,6 +374,7 @@ class BookInfoActivity : private fun showBook(book: Book) = binding.run { showCover(book) + addColorScheme(binding.ivCover.drawable) tvName.text = book.name tvAuthor.text = getString(R.string.author_show, book.getRealAuthor()) tvOrigin.text = getString(R.string.origin_show, book.originName) @@ -377,7 +410,21 @@ class BookInfoActivity : } private fun showCover(book: Book) { - binding.ivCover.load(book.getDisplayCover(), book.name, book.author, false, book.origin) { + binding.ivCover.load( + book.getDisplayCover(), + book.name, + book.author, + false, + book.origin, + onLoadFinish = { + binding.ivCover.post { + val drawable = binding.ivCover.drawable + if (drawable != null) { + addColorScheme(drawable) + } + } + } + ) if (!AppConfig.isEInkMode) { //高版本使用RenderEffect BookCover.load(this, book.getDisplayCover(), false, book.origin) @@ -392,9 +439,139 @@ class BookInfoActivity : .into(binding.bgBook) } } + addColorScheme(binding.ivCover.drawable) + + } + + private fun addColorScheme(drawable: Drawable?) { + currentJob?.cancel() + currentJob = CoroutineScope(Dispatchers.Default).launch { + val bitmap = when (drawable) { + is BitmapDrawable -> drawable.bitmap + is TransitionDrawable -> (drawable.getDrawable(1) as? BitmapDrawable)?.bitmap + else -> null + } ?: return@launch + + val colorAccuracy = true + val targetWidth = if (colorAccuracy) (bitmap.width / 4).coerceAtMost(256) else 16 + val targetHeight = if (colorAccuracy) (bitmap.height / 4).coerceAtMost(256) else 16 + val scaledBitmap = bitmap.scale(targetWidth, targetHeight, false) + + val options = DynamicColorsOptions.Builder() + .setContentBasedSource(scaledBitmap) + .build() + + wrappedContext = DynamicColors.wrapContextIfAvailable( + this@BookInfoActivity, + options + ).apply { + resources.configuration.uiMode = + this@BookInfoActivity.resources.configuration.uiMode + } + + withContext(Dispatchers.Main) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + applyColorScheme() + } + } } } + private suspend fun applyColorScheme() { + val ctx = wrappedContext ?: this + + val colorPrimary = MaterialColors.getColor(ctx, androidx.appcompat.R.attr.colorPrimary, -1) + val colorSecondary = + MaterialColors.getColor(ctx, com.google.android.material.R.attr.colorSecondary, -1) + val colorTertiary = + MaterialColors.getColor(ctx, com.google.android.material.R.attr.colorTertiary, -1) + val colorOnSurface = + MaterialColors.getColor(ctx, com.google.android.material.R.attr.colorOnSurface, -1) + val colorSurface = + MaterialColors.getColor(ctx, com.google.android.material.R.attr.colorSurface, -1) + val colorSurfaceContainer = MaterialColors.getColor( + ctx, + com.google.android.material.R.attr.colorSurfaceContainer, + -1 + ) + val colorSecondaryContainer = MaterialColors.getColor( + ctx, + com.google.android.material.R.attr.colorSecondaryContainer, + -1 + ) + + val surfaceTransition = ValueAnimator.ofArgb(surfaceFinalColor, colorSurface).apply { + duration = 400L + addUpdateListener { animation -> + val color = animation.animatedValue as Int + binding.cdInfo?.setCardBackgroundColor(color) + binding.llInfo.setBackgroundColor(color) + } + } + + val buttonTransition = ValueAnimator.ofArgb(secondaryFinalColor, colorSecondary).apply { + duration = 400L + addUpdateListener { animation -> + val color = animation.animatedValue as Int + val tint = ColorStateList.valueOf(color) + listOf( + binding.btnShelf, + binding.tvTocView, + binding.tvChangeGroup, + binding.btnChangeSource + ).forEach { btn -> + btn.setTextColor(color) + btn.iconTint = tint + } + } + } + + val backTransition = + ValueAnimator.ofArgb(secondaryContainerFinalColor, colorSecondaryContainer).apply { + duration = 400L + addUpdateListener { animation -> + val color = animation.animatedValue as Int + binding.bgBookMask.setBackgroundColor(color) + } + } + + val textTransition = ValueAnimator.ofArgb(onSurfaceFinalColor, colorOnSurface).apply { + duration = 400L + addUpdateListener { animation -> + val color = animation.animatedValue as Int + binding.tvName.setTextColor(color) + binding.tvAuthor.setTextColor(color) + binding.tvOrigin.setTextColor(color) + binding.tvDetail.setTextColor(color) + binding.ivName.imageTintList = ColorStateList.valueOf(color) + binding.ivWeb.imageTintList = ColorStateList.valueOf(color) + } + } + + withContext(Dispatchers.Main) { + surfaceTransition.start() + buttonTransition.start() + textTransition.start() + backTransition.start() + } + + surfaceFinalColor = colorSurface + secondaryFinalColor = colorSecondary + onSurfaceFinalColor = colorOnSurface + + (binding.llCover.background as? GradientDrawable)?.colors = + intArrayOf(Color.TRANSPARENT, colorSurface) + + 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? = null) { when { isLoading -> { diff --git a/app/src/main/java/io/legato/kazusa/ui/widget/LabelsBar.kt b/app/src/main/java/io/legato/kazusa/ui/widget/LabelsBar.kt index 520bad281..bdd8df3e2 100644 --- a/app/src/main/java/io/legato/kazusa/ui/widget/LabelsBar.kt +++ b/app/src/main/java/io/legato/kazusa/ui/widget/LabelsBar.kt @@ -47,9 +47,20 @@ class LabelsBar @JvmOverloads constructor( usedChips.add(it) } } - style(chip) // 在这里应用外部传入的样式 + style(chip) chip.text = label addView(chip) } + fun applyColorScheme(colorPrimaryContainer: Int, colorOnPrimaryContainer: Int) { + usedChips.forEach { chip -> + chip.chipBackgroundColor = ColorStateList.valueOf(colorPrimaryContainer) + chip.setTextColor(colorOnPrimaryContainer) + } + unUsedChips.forEach { chip -> + chip.chipBackgroundColor = ColorStateList.valueOf(colorPrimaryContainer) + chip.setTextColor(colorOnPrimaryContainer) + } + } + } 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 16173bc64..6d671073c 100644 --- a/app/src/main/res/layout-land/activity_book_info.xml +++ b/app/src/main/res/layout-land/activity_book_info.xml @@ -10,9 +10,16 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:contentDescription="@string/bg_image" - android:foreground="@drawable/bg_book_mask_land" android:scaleType="centerCrop" /> + + - - + app:cardCornerRadius="8dp" + app:layout_constraintDimensionRatio="5:7" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.3" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintWidth_percent="0.5" + app:strokeWidth="0dp"> - + - + - + - + - - + - + - + - - - - - - - - - + android:layout_marginHorizontal="32dp" + android:layout_marginVertical="16dp" + android:layout_weight="5" + app:strokeWidth="0dp"> - + android:layout_height="match_parent" + android:layout_margin="8dp" + android:background="@drawable/bg_gradient_mask_land" + android:padding="8dp"> - + android:scrollbars="none" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> - + - + - - + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/scroll_labels"> + app:iconSize="20dp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - + app:iconSize="20dp" + app:layout_constraintStart_toEndOf="@id/btn_shelf" + app:layout_constraintTop_toTopOf="@id/btn_shelf" /> - + app:iconSize="20dp" + app:layout_constraintStart_toEndOf="@id/tv_toc_view" + app:layout_constraintTop_toTopOf="@id/tv_toc_view" /> - + - - - + android:layout_marginTop="8dp" + android:textSize="16sp" + android:textStyle="bold" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/cl_buttons" + tools:text="@string/toc_s" /> - + - - + - + - + - - + - - - - - - - + + @@ -363,15 +370,13 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" - android:layout_marginEnd="40dp" - android:minWidth="0dp" - android:layout_marginBottom="24dp" + android:layout_margin="48dp" + android:contentDescription="@string/reading" + android:minWidth="56dp" android:text="@string/reading" android:textColor="?attr/colorOnPrimary" - android:contentDescription="@string/reading" - app:iconGravity="textStart" + app:backgroundTint="?attr/colorTertiary" app:icon="@drawable/ic_bottom_books" - app:backgroundTint="?attr/colorSecondary" 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 200493993..2501a39ac 100644 --- a/app/src/main/res/layout/activity_audio_play.xml +++ b/app/src/main/res/layout/activity_audio_play.xml @@ -14,16 +14,11 @@ android:scaleType="centerCrop" tools:ignore="ContentDescription,ImageContrastCheck" /> - - - - + + - - + android:paddingVertical="8dp" + app:layout_constraintTop_toTopOf="parent"> + + + + + android:padding="12dp" + app:layout_constraintBottom_toBottomOf="@id/cd_cov" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@id/cd_cov" + app:layout_constraintTop_toTopOf="@id/cd_cov"> - - + + + android:orientation="vertical" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@id/ll_cover"> - - - - - - - + android:paddingStart="16dp" + android:scrollbars="none" + app:layout_constraintTop_toTopOf="parent"> - + android:visibility="gone" /> - + - - + - - - - - - - - + android:layout_weight="1" + android:padding="8dp" + android:text="@string/remove_from_bookshelf" + android:textSize="12sp" + app:icon="@drawable/ic_clear_all" + app:iconGravity="top" + app:iconPadding="4dp" + app:iconSize="20dp" /> - + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/tv_chapter" + tools:text="@string/book_intro" /> - - + +