优化共享元素动画

This commit is contained in:
HapeLee
2025-11-18 00:29:45 +08:00
parent b91b99c9ba
commit 3aece2eadd
13 changed files with 395 additions and 350 deletions
@@ -586,7 +586,7 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
get() = appCtx.getPrefBoolean(PreferKey.delayBookLoadEnable, true)
val sharedElementEnterTransitionEnable
get() = appCtx.getPrefBoolean(PreferKey.sharedElementEnterTransitionEnable, true)
get() = appCtx.getPrefBoolean(PreferKey.sharedElementEnterTransitionEnable, false)
var searchScope: String
get() = appCtx.getPrefString("searchScope") ?: ""
@@ -61,7 +61,7 @@ object ReadBookConfig {
var bgMeanColor: Int = 0
val textColor: Int get() = durConfig.curTextColor()
val textShadowColor: Int get() = durConfig.curTextShadowColor()
val menuColor: Int get() = durConfig.curMenuAc()
init {
initConfigs()
initShareConfig()
@@ -287,21 +287,21 @@ class ReadBookActivity : BaseReadBookActivity(),
@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
if (AppConfig.sharedElementEnterTransitionEnable) {
setEnterSharedElementCallback(MaterialContainerTransformSharedElementCallback())
setExitSharedElementCallback(MaterialContainerTransformSharedElementCallback())
val transform = MaterialContainerTransform().apply {
addTarget(binding.root)
scrimColor = Color.TRANSPARENT
duration = delayMillis
}
window.sharedElementEnterTransition = transform
window.sharedElementReturnTransition = transform
setEnterSharedElementCallback(MaterialContainerTransformSharedElementCallback())
setExitSharedElementCallback(MaterialContainerTransformSharedElementCallback())
val transform = MaterialContainerTransform().apply {
addTarget(binding.root)
scrimColor = Color.TRANSPARENT
duration = delayMillis
}
window.sharedElementEnterTransition = transform
window.sharedElementReturnTransition = transform
super.onCreate(savedInstanceState)
if (AppConfig.sharedElementEnterTransitionEnable){
binding.rootView.transitionName = intent.getStringExtra("transitionName")
}
binding.rootView.transitionName = intent.getStringExtra("transitionName")
upScreenTimeOut()
ReadBook.register(this)
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.recordIfNeededThenDraw
import io.legado.app.utils.dpToPx
import io.legado.app.utils.themeColor
/**
* 行信息
@@ -178,7 +177,7 @@ data class TextLine(
ChapterProvider.contentPaint
}
val textColor = if (isReadAloud) {
view.context.themeColor(androidx.appcompat.R.attr.colorPrimary)
ReadBookConfig.menuColor
} else {
ReadBookConfig.textColor
}
@@ -45,6 +45,8 @@ import io.legado.app.utils.bookshelfLayoutGrid
import io.legado.app.utils.bookshelfLayoutMode
import io.legado.app.utils.cnCompare
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 kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
@@ -290,46 +292,60 @@ class BooksFragment() : BaseFragment(R.layout.fragment_books),
}
override fun open(book: Book, sharedView: View) {
val transitionName = "book_${book.bookUrl}"
sharedView.transitionName = transitionName
if (AppConfig.sharedElementEnterTransitionEnable){
val transitionName = "book_${book.bookUrl}"
sharedView.transitionName = transitionName
val cls = when {
book.isAudio -> AudioPlayActivity::class.java
book.isImage && AppConfig.showMangaUi -> ReadMangaActivity::class.java
else -> ReadBookActivity::class.java
val cls = when {
book.isAudio -> AudioPlayActivity::class.java
book.isImage && AppConfig.showMangaUi -> ReadMangaActivity::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) {
val intent = Intent(requireContext(), BookInfoActivity::class.java).apply {
putExtra("name", book.name)
putExtra("author", book.author)
putExtra("bookUrl", book.bookUrl)
putExtra("transitionName", "book_${book.bookUrl}") // 给共享元素唯一标识
if (AppConfig.sharedElementEnterTransitionEnable){
val intent = Intent(requireContext(), BookInfoActivity::class.java).apply {
putExtra("name", book.name)
putExtra("author", book.author)
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.observeEvent
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 kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
@@ -338,62 +340,86 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
}
override fun onItemClick(item: Any, sharedView: View) {
when (item) {
is Book -> {
val transitionName = "book_${item.bookUrl}"
sharedView.transitionName = transitionName
if (AppConfig.sharedElementEnterTransitionEnable){
when (item) {
is Book -> {
val transitionName = "book_${item.bookUrl}"
sharedView.transitionName = transitionName
val cls = when {
item.isAudio -> AudioPlayActivity::class.java
item.isImage && AppConfig.showMangaUi -> ReadMangaActivity::class.java
else -> ReadBookActivity::class.java
val cls = when {
item.isAudio -> AudioPlayActivity::class.java
item.isImage && AppConfig.showMangaUi -> ReadMangaActivity::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 {
putExtra("bookUrl", item.bookUrl)
putExtra("transitionName", transitionName)
is BookGroup -> {
groupId = item.groupId
initBooksData()
groupIdChangeListener?.onGroupIdChanged()
updateBackCallbackState()
}
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(
requireActivity(),
sharedView,
transitionName
)
startActivity(intent, options.toBundle())
}
} else {
when (item) {
is Book -> startActivityForBook(item)
is BookGroup -> {
groupId = item.groupId
initBooksData()
groupIdChangeListener?.onGroupIdChanged()
updateBackCallbackState()
is BookGroup -> {
groupId = item.groupId
initBooksData()
}
}
}
}
override fun onItemLongClick(item: Any, sharedView: View) {
when (item) {
is Book -> {
val intent = Intent(requireContext(), BookInfoActivity::class.java).apply {
if (AppConfig.sharedElementEnterTransitionEnable){
when (item) {
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("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))
}
is BookGroup -> showDialogFragment(GroupEditDialog(item))
}
}