优化共享元素动画

This commit is contained in:
HapeLee committed 2025-11-18 00:29:45 +08:00
1 parent b91b99c9ba
commit 3aece2eadd
13 files changed
+395 -350

No files matched your search

@@ -586,7 +586,7 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
get() = appCtx.getPrefBoolean(PreferKey.delayBookLoadEnable, true) get() = appCtx.getPrefBoolean(PreferKey.delayBookLoadEnable, true)
val sharedElementEnterTransitionEnable val sharedElementEnterTransitionEnable
get() = appCtx.getPrefBoolean(PreferKey.sharedElementEnterTransitionEnable, true) get() = appCtx.getPrefBoolean(PreferKey.sharedElementEnterTransitionEnable, false)
var searchScope: String var searchScope: String
get() = appCtx.getPrefString("searchScope") ?: "" get() = appCtx.getPrefString("searchScope") ?: ""
@@ -61,7 +61,7 @@ object ReadBookConfig {
var bgMeanColor: Int = 0 var bgMeanColor: Int = 0
val textColor: Int get() = durConfig.curTextColor() val textColor: Int get() = durConfig.curTextColor()
val textShadowColor: Int get() = durConfig.curTextShadowColor() val textShadowColor: Int get() = durConfig.curTextShadowColor()
val menuColor: Int get() = durConfig.curMenuAc()
init { init {
initConfigs() initConfigs()
initShareConfig() initShareConfig()
@@ -287,21 +287,21 @@ class ReadBookActivity : BaseReadBookActivity(),
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
if (AppConfig.sharedElementEnterTransitionEnable) {
setEnterSharedElementCallback(MaterialContainerTransformSharedElementCallback()) setEnterSharedElementCallback(MaterialContainerTransformSharedElementCallback())
setExitSharedElementCallback(MaterialContainerTransformSharedElementCallback()) setExitSharedElementCallback(MaterialContainerTransformSharedElementCallback())
val transform = MaterialContainerTransform().apply { val transform = MaterialContainerTransform().apply {
addTarget(binding.root) addTarget(binding.root)
scrimColor = Color.TRANSPARENT scrimColor = Color.TRANSPARENT
duration = delayMillis duration = delayMillis
}
window.sharedElementEnterTransition = transform
window.sharedElementReturnTransition = transform
} }
window.sharedElementEnterTransition = transform
window.sharedElementReturnTransition = transform
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
if (AppConfig.sharedElementEnterTransitionEnable){
binding.rootView.transitionName = intent.getStringExtra("transitionName") binding.rootView.transitionName = intent.getStringExtra("transitionName")
}
upScreenTimeOut() upScreenTimeOut()
ReadBook.register(this) ReadBook.register(this)
binding.readMenu.colorSurfaceContainer = binding.readMenu.colorSurfaceContainer =
@@ -18,7 +18,6 @@ import io.legado.app.ui.book.read.page.provider.ChapterProvider
import io.legado.app.utils.canvasrecorder.CanvasRecorderFactory import io.legado.app.utils.canvasrecorder.CanvasRecorderFactory
import io.legado.app.utils.canvasrecorder.recordIfNeededThenDraw import io.legado.app.utils.canvasrecorder.recordIfNeededThenDraw
import io.legado.app.utils.dpToPx import io.legado.app.utils.dpToPx
import io.legado.app.utils.themeColor
/** /**
* 行信息 * 行信息
@@ -178,7 +177,7 @@ data class TextLine(
ChapterProvider.contentPaint ChapterProvider.contentPaint
} }
val textColor = if (isReadAloud) { val textColor = if (isReadAloud) {
view.context.themeColor(androidx.appcompat.R.attr.colorPrimary) ReadBookConfig.menuColor
} else { } else {
ReadBookConfig.textColor ReadBookConfig.textColor
} }
@@ -45,6 +45,8 @@ import io.legado.app.utils.bookshelfLayoutGrid
import io.legado.app.utils.bookshelfLayoutMode import io.legado.app.utils.bookshelfLayoutMode
import io.legado.app.utils.cnCompare import io.legado.app.utils.cnCompare
import io.legado.app.utils.observeEvent import io.legado.app.utils.observeEvent
import io.legado.app.utils.startActivity
import io.legado.app.utils.startActivityForBook
import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
@@ -290,46 +292,60 @@ class BooksFragment() : BaseFragment(R.layout.fragment_books),
} }
override fun open(book: Book, sharedView: View) { override fun open(book: Book, sharedView: View) {
val transitionName = "book_${book.bookUrl}" if (AppConfig.sharedElementEnterTransitionEnable){
sharedView.transitionName = transitionName val transitionName = "book_${book.bookUrl}"
sharedView.transitionName = transitionName
val cls = when { val cls = when {
book.isAudio -> AudioPlayActivity::class.java book.isAudio -> AudioPlayActivity::class.java
book.isImage && AppConfig.showMangaUi -> ReadMangaActivity::class.java book.isImage && AppConfig.showMangaUi -> ReadMangaActivity::class.java
else -> ReadBookActivity::class.java else -> ReadBookActivity::class.java
}
val intent = Intent(requireContext(), cls).apply {
putExtra("bookUrl", book.bookUrl)
putExtra("transitionName", transitionName)
}
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(
requireActivity(),
sharedView,
transitionName
)
startActivity(intent, options.toBundle())
} else {
startActivityForBook(book)
} }
val intent = Intent(requireContext(), cls).apply {
putExtra("bookUrl", book.bookUrl)
putExtra("transitionName", transitionName)
}
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(
requireActivity(),
sharedView,
transitionName
)
startActivity(intent, options.toBundle())
} }
override fun openBookInfo(book: Book, sharedView: View) { override fun openBookInfo(book: Book, sharedView: View) {
val intent = Intent(requireContext(), BookInfoActivity::class.java).apply { if (AppConfig.sharedElementEnterTransitionEnable){
putExtra("name", book.name) val intent = Intent(requireContext(), BookInfoActivity::class.java).apply {
putExtra("author", book.author) putExtra("name", book.name)
putExtra("bookUrl", book.bookUrl) putExtra("author", book.author)
putExtra("transitionName", "book_${book.bookUrl}") // 给共享元素唯一标识 putExtra("bookUrl", book.bookUrl)
putExtra("transitionName", "book_${book.bookUrl}")
}
sharedView.transitionName = "book_${book.bookUrl}"
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(
requireActivity(),
sharedView,
sharedView.transitionName
)
startActivity(intent, options.toBundle())
} else {
startActivity<BookInfoActivity> {
putExtra("name", book.name)
putExtra("author", book.author)
putExtra("bookUrl", book.bookUrl)
}
} }
sharedView.transitionName = "book_${book.bookUrl}"
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(
requireActivity(),
sharedView,
sharedView.transitionName
)
startActivity(intent, options.toBundle())
} }
@@ -49,6 +49,8 @@ import io.legado.app.utils.cnCompare
import io.legado.app.utils.flowWithLifecycleAndDatabaseChangeFirst import io.legado.app.utils.flowWithLifecycleAndDatabaseChangeFirst
import io.legado.app.utils.observeEvent import io.legado.app.utils.observeEvent
import io.legado.app.utils.showDialogFragment import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.startActivity
import io.legado.app.utils.startActivityForBook
import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
@@ -338,62 +340,86 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
} }
override fun onItemClick(item: Any, sharedView: View) { override fun onItemClick(item: Any, sharedView: View) {
when (item) { if (AppConfig.sharedElementEnterTransitionEnable){
is Book -> { when (item) {
val transitionName = "book_${item.bookUrl}" is Book -> {
sharedView.transitionName = transitionName val transitionName = "book_${item.bookUrl}"
sharedView.transitionName = transitionName
val cls = when { val cls = when {
item.isAudio -> AudioPlayActivity::class.java item.isAudio -> AudioPlayActivity::class.java
item.isImage && AppConfig.showMangaUi -> ReadMangaActivity::class.java item.isImage && AppConfig.showMangaUi -> ReadMangaActivity::class.java
else -> ReadBookActivity::class.java else -> ReadBookActivity::class.java
}
val intent = Intent(requireContext(), cls).apply {
putExtra("bookUrl", item.bookUrl)
putExtra("transitionName", transitionName)
}
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(
requireActivity(),
sharedView,
transitionName
)
startActivity(intent, options.toBundle())
} }
val intent = Intent(requireContext(), cls).apply { is BookGroup -> {
putExtra("bookUrl", item.bookUrl) groupId = item.groupId
putExtra("transitionName", transitionName) initBooksData()
groupIdChangeListener?.onGroupIdChanged()
updateBackCallbackState()
} }
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(
requireActivity(),
sharedView,
transitionName
)
startActivity(intent, options.toBundle())
} }
} else {
when (item) {
is Book -> startActivityForBook(item)
is BookGroup -> { is BookGroup -> {
groupId = item.groupId groupId = item.groupId
initBooksData() initBooksData()
groupIdChangeListener?.onGroupIdChanged() }
updateBackCallbackState()
} }
} }
} }
override fun onItemLongClick(item: Any, sharedView: View) { override fun onItemLongClick(item: Any, sharedView: View) {
when (item) { if (AppConfig.sharedElementEnterTransitionEnable){
is Book -> { when (item) {
val intent = Intent(requireContext(), BookInfoActivity::class.java).apply { is Book -> {
val intent = Intent(requireContext(), BookInfoActivity::class.java).apply {
putExtra("name", item.name)
putExtra("author", item.author)
putExtra("bookUrl", item.bookUrl)
putExtra("transitionName", "book_${item.bookUrl}") // 给共享元素唯一标识
}
sharedView.transitionName = "book_${item.bookUrl}"
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(
requireActivity(),
sharedView,
sharedView.transitionName
)
startActivity(intent, options.toBundle())
}
is BookGroup -> showDialogFragment(GroupEditDialog(item))
}
} else {
when (item) {
is Book -> startActivity<BookInfoActivity> {
putExtra("name", item.name) putExtra("name", item.name)
putExtra("author", item.author) putExtra("author", item.author)
putExtra("bookUrl", item.bookUrl) putExtra("bookUrl", item.bookUrl)
putExtra("transitionName", "book_${item.bookUrl}") // 给共享元素唯一标识
} }
sharedView.transitionName = "book_${item.bookUrl}" is BookGroup -> showDialogFragment(GroupEditDialog(item))
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(
requireActivity(),
sharedView,
sharedView.transitionName
)
startActivity(intent, options.toBundle())
} }
is BookGroup -> showDialogFragment(GroupEditDialog(item))
} }
} }
@@ -184,6 +184,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingHorizontal="16dp" android:paddingHorizontal="16dp"
android:layout_marginVertical="8dp"
app:singleLine="true" app:singleLine="true"
app:singleSelection="true" app:singleSelection="true"
app:selectionRequired="true"> app:selectionRequired="true">
@@ -301,6 +302,7 @@
<ImageView <ImageView
android:layout_width="16dp" android:layout_width="16dp"
android:layout_height="48dp" android:layout_height="48dp"
android:importantForAccessibility="no"
app:layout_constraintStart_toEndOf="@id/cb_share_layout" app:layout_constraintStart_toEndOf="@id/cb_share_layout"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
+79 -83
View File
@@ -1,106 +1,102 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/cv_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
app:cardBackgroundColor="@android:color/transparent"
android:layout_marginBottom="4dp"
android:clickable="true"
android:focusable="true"
app:strokeWidth="0dp"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.card.MaterialCardView <LinearLayout
android:id="@+id/cv_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:cardBackgroundColor="@android:color/transparent" android:orientation="vertical">
android:layout_marginBottom="4dp"
android:clickable="true"
android:focusable="true"
app:strokeWidth="0dp"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout <com.google.android.material.card.MaterialCardView
android:id="@+id/cd_cover"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:orientation="vertical"> app:cardCornerRadius="6dp"
android:layout_marginHorizontal="8dp"
android:layout_marginTop="8dp"
android:transitionName="img_cover"
app:strokeWidth="0dp">
<com.google.android.material.card.MaterialCardView <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cd_cover"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content">
app:cardCornerRadius="6dp"
android:layout_marginHorizontal="8dp"
android:layout_marginTop="8dp"
android:transitionName="img_cover"
app:strokeWidth="0dp">
<androidx.constraintlayout.widget.ConstraintLayout <io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/iv_cover"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/image_cover_default"
tools:ignore="ImageContrastCheck" />
<io.legado.app.ui.widget.image.CoverImageView <com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/iv_cover" android:id="@+id/rl_loading"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:scaleType="centerCrop" android:layout_marginVertical="4dp"
android:src="@drawable/image_cover_default" android:layout_marginHorizontal="12dp"
tools:ignore="ImageContrastCheck" /> android:indeterminate="true"
android:visibility="invisible"
android:layout_gravity="top"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.progressindicator.LinearProgressIndicator <com.google.android.material.card.MaterialCardView
android:id="@+id/rl_loading" android:id="@+id/cd_unread"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginVertical="4dp" android:layout_margin="4dp"
android:layout_marginHorizontal="12dp" android:visibility="visible"
android:indeterminate="true" app:cardCornerRadius="4dp"
android:visibility="invisible" app:strokeWidth="0dp"
android:layout_gravity="top" app:cardBackgroundColor="?attr/colorSecondaryVariant"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent">
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.card.MaterialCardView <TextView
android:id="@+id/cd_unread" android:id="@+id/tv_unread"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="4dp" android:textColor="?attr/colorOnSecondary"
android:visibility="visible" android:textSize="10sp"
app:cardCornerRadius="4dp" android:padding="4dp"
app:strokeWidth="0dp" android:textStyle="bold"
app:cardBackgroundColor="?attr/colorSecondaryVariant" android:includeFontPadding="false"
app:layout_constraintEnd_toEndOf="parent" tools:text="5"
app:layout_constraintTop_toTopOf="parent"> tools:ignore="SmallSp" />
<TextView </com.google.android.material.card.MaterialCardView>
android:id="@+id/tv_unread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/colorOnSecondary"
android:textSize="10sp"
android:padding="4dp"
android:textStyle="bold"
android:includeFontPadding="false"
tools:text="5"
tools:ignore="SmallSp" />
</com.google.android.material.card.MaterialCardView> </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </com.google.android.material.card.MaterialCardView>
</com.google.android.material.card.MaterialCardView> <!-- 书名 -->
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginBottom="6dp"
android:layout_marginHorizontal="8dp"
android:ellipsize="end"
android:gravity="left"
android:lines="2"
android:text="@string/book_name"
android:textSize="12sp"
android:textStyle="bold"
tools:ignore="RtlHardcoded" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<!-- 书名 -->
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginBottom="6dp"
android:layout_marginHorizontal="8dp"
android:ellipsize="end"
android:gravity="left"
android:lines="2"
android:text="@string/book_name"
android:textSize="12sp"
android:textStyle="bold"
tools:ignore="RtlHardcoded" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -1,156 +1,151 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/cv_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:foreground="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
app:strokeWidth="0dp"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.card.MaterialCardView <LinearLayout
android:id="@+id/cv_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="4dp" android:orientation="vertical">
android:foreground="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
app:strokeWidth="0dp"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout <com.google.android.material.card.MaterialCardView
android:id="@+id/cd_cover"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:orientation="vertical"> app:cardCornerRadius="6dp"
android:layout_marginHorizontal="8dp"
android:layout_marginTop="8dp"
android:transitionName="img_cover"
app:strokeWidth="0dp">
<com.google.android.material.card.MaterialCardView <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cd_cover"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content">
app:cardCornerRadius="6dp"
android:layout_marginHorizontal="8dp"
android:layout_marginTop="8dp"
android:transitionName="img_cover"
app:strokeWidth="0dp">
<androidx.constraintlayout.widget.ConstraintLayout <io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/iv_cover"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="?attr/colorSurfaceVariant"
tools:ignore="ImageContrastCheck" />
<io.legado.app.ui.widget.image.CoverImageView <com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/iv_cover" android:id="@+id/rl_loading"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:scaleType="centerCrop" android:layout_marginVertical="4dp"
android:src="?attr/colorSurfaceVariant" android:layout_marginHorizontal="12dp"
tools:ignore="ImageContrastCheck" /> android:indeterminate="true"
android:visibility="invisible"
android:layout_gravity="top"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.progressindicator.LinearProgressIndicator <com.google.android.material.card.MaterialCardView
android:id="@+id/rl_loading" android:id="@+id/cd_unread"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginVertical="4dp" android:layout_margin="4dp"
android:layout_marginHorizontal="12dp" android:visibility="visible"
android:indeterminate="true" app:cardCornerRadius="4dp"
android:visibility="invisible" app:strokeWidth="0dp"
android:layout_gravity="top" app:cardBackgroundColor="?attr/colorSecondaryVariant"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.card.MaterialCardView <TextView
android:id="@+id/cd_unread" android:id="@+id/tv_unread"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="4dp" android:textColor="?attr/colorSurface"
android:visibility="visible" android:textSize="10sp"
app:cardCornerRadius="4dp" android:padding="4dp"
app:strokeWidth="0dp" android:textStyle="bold"
app:cardBackgroundColor="?attr/colorSecondaryVariant" android:includeFontPadding="false"
app:layout_constraintEnd_toEndOf="parent" tools:text="5"
app:layout_constraintTop_toTopOf="parent"> tools:ignore="SmallSp" />
<TextView </com.google.android.material.card.MaterialCardView>
android:id="@+id/tv_unread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/colorSurface"
android:textSize="10sp"
android:padding="4dp"
android:textStyle="bold"
android:includeFontPadding="false"
tools:text="5"
tools:ignore="SmallSp" />
</com.google.android.material.card.MaterialCardView> <io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/iv_cover1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginBottom="2dp"
android:layout_marginStart="4dp"
android:layout_marginEnd="2dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toStartOf="@id/iv_cover2"
app:layout_constraintBottom_toTopOf="@id/iv_cover3"/>
<io.legado.app.ui.widget.image.CoverImageView <io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/iv_cover1" android:id="@+id/iv_cover2"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:layout_marginBottom="2dp" android:layout_marginBottom="2dp"
android:layout_marginStart="4dp" android:layout_marginEnd="4dp"
android:layout_marginEnd="2dp" android:layout_marginStart="2dp"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toStartOf="@id/iv_cover2" app:layout_constraintStart_toEndOf="@id/iv_cover1"
app:layout_constraintBottom_toTopOf="@id/iv_cover3"/> app:layout_constraintBottom_toTopOf="@id/iv_cover4"/>
<io.legado.app.ui.widget.image.CoverImageView <io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/iv_cover2" android:id="@+id/iv_cover3"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="2dp"
android:layout_marginBottom="2dp" android:layout_marginStart="4dp"
android:layout_marginEnd="4dp" android:layout_marginBottom="4dp"
android:layout_marginStart="2dp" android:layout_marginEnd="2dp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintStart_toEndOf="@id/iv_cover1" app:layout_constraintTop_toBottomOf="@id/iv_cover1"
app:layout_constraintBottom_toTopOf="@id/iv_cover4"/> app:layout_constraintEnd_toStartOf="@id/iv_cover4"/>
<io.legado.app.ui.widget.image.CoverImageView <io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/iv_cover3" android:id="@+id/iv_cover4"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="2dp" android:layout_marginTop="2dp"
android:layout_marginStart="4dp" android:layout_marginEnd="4dp"
android:layout_marginBottom="4dp" android:layout_marginBottom="4dp"
android:layout_marginEnd="2dp" android:layout_marginStart="2dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/iv_cover1" app:layout_constraintTop_toBottomOf="@id/iv_cover2"
app:layout_constraintEnd_toStartOf="@id/iv_cover4"/> app:layout_constraintStart_toEndOf="@id/iv_cover3"/>
<io.legado.app.ui.widget.image.CoverImageView </androidx.constraintlayout.widget.ConstraintLayout>
android:id="@+id/iv_cover4"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginEnd="4dp"
android:layout_marginBottom="4dp"
android:layout_marginStart="2dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/iv_cover2"
app:layout_constraintStart_toEndOf="@id/iv_cover3"/>
</androidx.constraintlayout.widget.ConstraintLayout> </com.google.android.material.card.MaterialCardView>
</com.google.android.material.card.MaterialCardView> <!-- 书名 -->
<TextView
<!-- 书名 --> android:id="@+id/tv_name"
<TextView android:layout_width="match_parent"
android:id="@+id/tv_name" android:layout_height="wrap_content"
android:layout_width="match_parent" android:layout_marginTop="4dp"
android:layout_height="wrap_content" android:layout_marginBottom="6dp"
android:layout_marginTop="4dp" android:layout_marginHorizontal="8dp"
android:layout_marginBottom="6dp" android:ellipsize="end"
android:layout_marginHorizontal="8dp" android:gravity="left"
android:ellipsize="end" android:lines="2"
android:gravity="left" android:text="@string/book_name"
android:lines="2" android:textSize="12sp"
android:text="@string/book_name" android:textStyle="bold"
android:textSize="12sp" tools:ignore="RtlHardcoded" />
android:textStyle="bold" </LinearLayout>
tools:ignore="RtlHardcoded" /> </com.google.android.material.card.MaterialCardView>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout>
+55 -44
View File
@@ -19,58 +19,69 @@
android:id="@+id/cd_cover" android:id="@+id/cd_cover"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:cardCornerRadius="6dp"
app:strokeWidth="0dp"
android:layout_margin="8dp" android:layout_margin="8dp"
app:strokeWidth="0dp" android:transitionName="img_cover"
app:cardCornerRadius="8dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"> app:layout_constraintBottom_toBottomOf="parent">
<io.legado.app.ui.widget.image.CoverImageView <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/iv_cover" android:id="@+id/cl_cover"
android:layout_width="70dp" android:layout_width="70dp"
android:layout_height="98dp" android:layout_height="98dp">
android:scaleType="centerCrop"
android:src="@drawable/image_cover_default"
tools:ignore="ImageContrastCheck" />
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.progressindicator.LinearProgressIndicator <io.legado.app.ui.widget.image.CoverImageView
android:id="@+id/rl_loading" android:id="@+id/iv_cover"
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:layout_marginVertical="4dp" android:scaleType="centerCrop"
android:layout_marginHorizontal="6dp" android:src="@drawable/image_cover_default"
android:indeterminate="true" app:layout_constraintTop_toTopOf="parent"
android:visibility="invisible" app:layout_constraintStart_toStartOf="parent"
android:layout_gravity="top" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/cd_cover" tools:ignore="ImageContrastCheck" />
app:layout_constraintStart_toStartOf="@id/cd_cover"
app:layout_constraintEnd_toEndOf="@id/cd_cover" />
<com.google.android.material.card.MaterialCardView <com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/cd_unread" android:id="@+id/rl_loading"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="4dp" android:layout_marginVertical="4dp"
android:visibility="visible" android:layout_marginHorizontal="6dp"
app:cardCornerRadius="4dp" android:indeterminate="true"
app:strokeWidth="0dp" android:visibility="invisible"
app:cardBackgroundColor="?attr/colorSecondaryVariant" android:layout_gravity="top"
app:layout_constraintTop_toTopOf="@id/cd_cover" app:layout_constraintTop_toTopOf="@id/iv_cover"
app:layout_constraintEnd_toEndOf="@id/cd_cover"> app:layout_constraintStart_toStartOf="@id/iv_cover"
app:layout_constraintEnd_toEndOf="@id/iv_cover" />
<TextView <com.google.android.material.card.MaterialCardView
android:id="@+id/tv_unread" android:id="@+id/cd_unread"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textColor="?attr/colorOnSecondary" android:layout_margin="4dp"
android:textSize="10sp" android:visibility="visible"
android:padding="4dp" app:cardCornerRadius="4dp"
android:textStyle="bold" app:strokeWidth="0dp"
android:includeFontPadding="false" app:cardBackgroundColor="?attr/colorSecondaryVariant"
tools:text="5" app:layout_constraintTop_toTopOf="@id/iv_cover"
tools:ignore="SmallSp" /> app:layout_constraintEnd_toEndOf="@id/iv_cover">
<TextView
android:id="@+id/tv_unread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/colorOnSecondary"
android:textSize="10sp"
android:padding="4dp"
android:textStyle="bold"
android:includeFontPadding="false"
tools:text="5"
tools:ignore="SmallSp" />
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView> </com.google.android.material.card.MaterialCardView>
<LinearLayout <LinearLayout
+2 -2
View File
@@ -1280,9 +1280,9 @@
<string name="privacy">隐私</string> <string name="privacy">隐私</string>
<string name="notification_permission">通知权限</string> <string name="notification_permission">通知权限</string>
<string name="background_permission">后台权限</string> <string name="background_permission">后台权限</string>
<string name="opt_animation">从书架进入阅读界面时,优化动画效果。</string> <string name="opt_animation">从书架进入阅读界面时,优化动画效果。在某些设备上可能无法正常工作</string>
<string name="use_animation">使用共享元素动画</string> <string name="use_animation">使用共享元素动画</string>
<string name="reduce_stutter">减少进入阅读界面时的卡顿,但加载书籍时间会延长。</string> <string name="reduce_stutter">减少进入阅读界面时的卡顿,但加载书籍时间会延长。仅在开启共享元素动画时生效</string>
<string name="delay_book_load">延缓书籍加载</string> <string name="delay_book_load">延缓书籍加载</string>
<string name="compact_list">紧凑列表</string> <string name="compact_list">紧凑列表</string>
<string name="author_read">%s • %d章未读</string> <string name="author_read">%s • %d章未读</string>
+1 -1
View File
@@ -162,7 +162,7 @@
app:layout="@layout/view_preference_category"> app:layout="@layout/view_preference_category">
<io.legado.app.lib.prefs.SwitchPreference <io.legado.app.lib.prefs.SwitchPreference
android:defaultValue="true" android:defaultValue="false"
android:key="sharedElementEnterTransitionEnable" android:key="sharedElementEnterTransitionEnable"
android:summary="@string/opt_animation" android:summary="@string/opt_animation"
android:title="@string/use_animation" /> android:title="@string/use_animation" />
+1 -1
View File
@@ -1,4 +1,4 @@
VERSION_MAJOR=3 VERSION_MAJOR=3
VERSION_MINOR=26 VERSION_MINOR=26
VERSION_PATCH=3 VERSION_PATCH=3
VERSION_SUFFIX=-beta.6 VERSION_SUFFIX=