增加一些蜜汁小动画
This commit is contained in:
20 files changed
+176
-57
No files matched your search
@@ -29,6 +29,7 @@
|
|||||||
android:networkSecurityConfig="@xml/network_security_config"
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
android:requestLegacyExternalStorage="true"
|
android:requestLegacyExternalStorage="true"
|
||||||
android:enableOnBackInvokedCallback="true"
|
android:enableOnBackInvokedCallback="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/Base.AppTheme"
|
android:theme="@style/Base.AppTheme"
|
||||||
tools:ignore="AllowBackup,GoogleAppIndexingWarning,UnusedAttribute">
|
tools:ignore="AllowBackup,GoogleAppIndexingWarning,UnusedAttribute">
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package io.legato.kazusa.ui.book.info
|
|||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.graphics.Color
|
||||||
import android.graphics.RenderEffect
|
import android.graphics.RenderEffect
|
||||||
import android.graphics.Shader
|
import android.graphics.Shader
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
@@ -15,6 +16,7 @@ import androidx.activity.result.contract.ActivityResultContracts
|
|||||||
import androidx.activity.viewModels
|
import androidx.activity.viewModels
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
|
import com.google.android.material.transition.platform.MaterialContainerTransform
|
||||||
import io.legato.kazusa.R
|
import io.legato.kazusa.R
|
||||||
import io.legato.kazusa.base.VMBaseActivity
|
import io.legato.kazusa.base.VMBaseActivity
|
||||||
import io.legato.kazusa.constant.BookType
|
import io.legato.kazusa.constant.BookType
|
||||||
@@ -151,14 +153,23 @@ class BookInfoActivity :
|
|||||||
|
|
||||||
@SuppressLint("PrivateResource")
|
@SuppressLint("PrivateResource")
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
window.sharedElementEnterTransition = MaterialContainerTransform().apply {
|
||||||
|
addTarget(binding.ivCover)
|
||||||
|
duration = 500
|
||||||
|
scrimColor = Color.TRANSPARENT
|
||||||
|
fadeMode = MaterialContainerTransform.FADE_MODE_THROUGH
|
||||||
|
}
|
||||||
|
window.sharedElementReturnTransition = MaterialContainerTransform().apply {
|
||||||
|
addTarget(binding.ivCover)
|
||||||
|
duration = 500
|
||||||
|
scrimColor = Color.TRANSPARENT
|
||||||
|
fadeMode = MaterialContainerTransform.FADE_MODE_THROUGH
|
||||||
|
}
|
||||||
|
window.sharedElementsUseOverlay = false
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
binding.ivCover.transitionName = intent.getStringExtra("transitionName")
|
||||||
setSupportActionBar(binding.topBar)
|
setSupportActionBar(binding.topBar)
|
||||||
binding.llRead?.applyNavigationBarMargin()
|
binding.llRead?.applyNavigationBarMargin()
|
||||||
// binding.refreshLayout?.setColorSchemeColors(accentColor)
|
|
||||||
// binding.llInfo.setBackgroundColor(backgroundColor)
|
|
||||||
// binding.flAction.setBackgroundColor(bottomBackground)
|
|
||||||
//binding.flAction.applyNavigationBarPadding()
|
|
||||||
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))
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package io.legato.kazusa.ui.book.manga
|
|||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.graphics.Color
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.KeyEvent
|
import android.view.KeyEvent
|
||||||
@@ -21,6 +22,7 @@ import com.bumptech.glide.Glide
|
|||||||
import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader
|
import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader
|
||||||
import com.bumptech.glide.request.target.Target.SIZE_ORIGINAL
|
import com.bumptech.glide.request.target.Target.SIZE_ORIGINAL
|
||||||
import com.bumptech.glide.util.FixedPreloadSizeProvider
|
import com.bumptech.glide.util.FixedPreloadSizeProvider
|
||||||
|
import com.google.android.material.transition.platform.MaterialContainerTransform
|
||||||
import io.legato.kazusa.BuildConfig
|
import io.legato.kazusa.BuildConfig
|
||||||
import io.legato.kazusa.R
|
import io.legato.kazusa.R
|
||||||
import io.legato.kazusa.base.VMBaseActivity
|
import io.legato.kazusa.base.VMBaseActivity
|
||||||
@@ -158,9 +160,21 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
window.sharedElementEnterTransition = MaterialContainerTransform().apply {
|
||||||
|
addTarget(binding.root)
|
||||||
|
duration = 500
|
||||||
|
scrimColor = Color.TRANSPARENT
|
||||||
|
fadeMode = MaterialContainerTransform.FADE_MODE_THROUGH
|
||||||
|
}
|
||||||
|
window.sharedElementReturnTransition = MaterialContainerTransform().apply {
|
||||||
|
addTarget(binding.root)
|
||||||
|
duration = 500
|
||||||
|
scrimColor = Color.TRANSPARENT
|
||||||
|
fadeMode = MaterialContainerTransform.FADE_MODE_THROUGH
|
||||||
|
}
|
||||||
upLayoutInDisplayCutoutMode()
|
upLayoutInDisplayCutoutMode()
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
binding.root.transitionName = intent.getStringExtra("transitionName")
|
||||||
ReadManga.register(this)
|
ReadManga.register(this)
|
||||||
upSystemUiVisibility(false)
|
upSystemUiVisibility(false)
|
||||||
initRecyclerView()
|
initRecyclerView()
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ package io.legato.kazusa.ui.book.read
|
|||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
|
import android.graphics.Color
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
@@ -22,6 +23,7 @@ import androidx.appcompat.widget.PopupMenu
|
|||||||
import androidx.core.view.get
|
import androidx.core.view.get
|
||||||
import androidx.core.view.size
|
import androidx.core.view.size
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
|
import com.google.android.material.transition.platform.MaterialContainerTransform
|
||||||
import com.jaredrummler.android.colorpicker.ColorPickerDialogListener
|
import com.jaredrummler.android.colorpicker.ColorPickerDialogListener
|
||||||
import io.legato.kazusa.BuildConfig
|
import io.legato.kazusa.BuildConfig
|
||||||
import io.legato.kazusa.R
|
import io.legato.kazusa.R
|
||||||
@@ -259,7 +261,20 @@ class ReadBookActivity : BaseReadBookActivity(),
|
|||||||
|
|
||||||
@SuppressLint("ClickableViewAccessibility")
|
@SuppressLint("ClickableViewAccessibility")
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
window.sharedElementEnterTransition = MaterialContainerTransform().apply {
|
||||||
|
addTarget(binding.rootView)
|
||||||
|
duration = 500
|
||||||
|
scrimColor = Color.TRANSPARENT
|
||||||
|
fadeMode = MaterialContainerTransform.FADE_MODE_THROUGH
|
||||||
|
}
|
||||||
|
window.sharedElementReturnTransition = MaterialContainerTransform().apply {
|
||||||
|
addTarget(binding.rootView)
|
||||||
|
duration = 500
|
||||||
|
scrimColor = Color.TRANSPARENT
|
||||||
|
fadeMode = MaterialContainerTransform.FADE_MODE_THROUGH
|
||||||
|
}
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
binding.rootView.transitionName = intent.getStringExtra("transitionName")
|
||||||
//binding.cursorLeft.setColorFilter(accentColor)
|
//binding.cursorLeft.setColorFilter(accentColor)
|
||||||
//binding.cursorRight.setColorFilter(accentColor)
|
//binding.cursorRight.setColorFilter(accentColor)
|
||||||
binding.cursorLeft.setOnTouchListener(this)
|
binding.cursorLeft.setOnTouchListener(this)
|
||||||
|
|||||||
@@ -598,6 +598,7 @@ class ReadMenu @JvmOverloads constructor(
|
|||||||
|
|
||||||
val result = mutableListOf<ToolButton>()
|
val result = mutableListOf<ToolButton>()
|
||||||
|
|
||||||
|
if (savedList.isNotEmpty()) {
|
||||||
savedList.forEach { (id, enabled) ->
|
savedList.forEach { (id, enabled) ->
|
||||||
if (enabled) allButtons[id]?.let { result.add(it) }
|
if (enabled) allButtons[id]?.let { result.add(it) }
|
||||||
}
|
}
|
||||||
@@ -607,6 +608,9 @@ class ReadMenu @JvmOverloads constructor(
|
|||||||
result.add(btn)
|
result.add(btn)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
result.addAll(getAllButtons().take(5))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ class BookshelfConfigBottomSheet : BaseBottomSheetDialogFragment(R.layout.dialog
|
|||||||
text = label
|
text = label
|
||||||
isCheckable = true
|
isCheckable = true
|
||||||
isClickable = true
|
isClickable = true
|
||||||
id = View.generateViewId()
|
id = index
|
||||||
}
|
}
|
||||||
chipGroupSort.addView(chip)
|
chipGroupSort.addView(chip)
|
||||||
if (index == AppConfig.bookshelfSort) {
|
if (index == AppConfig.bookshelfSort) {
|
||||||
@@ -113,8 +113,8 @@ class BookshelfConfigBottomSheet : BaseBottomSheetDialogFragment(R.layout.dialog
|
|||||||
postEvent(EventBus.BOOKSHELF_REFRESH, "")
|
postEvent(EventBus.BOOKSHELF_REFRESH, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bookshelfSort != chipGroupSort.indexOfChild(chipGroupSort.findViewById(chipGroupSort.checkedChipId))) {
|
if (bookshelfSort != chipGroupSort.checkedChipId) {
|
||||||
AppConfig.bookshelfSort = chipGroupSort.indexOfChild(chipGroupSort.findViewById(chipGroupSort.checkedChipId))
|
AppConfig.bookshelfSort = chipGroupSort.checkedChipId
|
||||||
(requireParentFragment() as? BaseBookshelfFragment)?.upSort()
|
(requireParentFragment() as? BaseBookshelfFragment)?.upSort()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
package io.legato.kazusa.ui.main.bookshelf.books
|
package io.legato.kazusa.ui.main.bookshelf.books
|
||||||
|
|
||||||
|
//import io.legado.app.lib.theme.accentColor
|
||||||
|
//import io.legado.app.lib.theme.primaryColor
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewConfiguration
|
import android.view.ViewConfiguration
|
||||||
|
import androidx.core.app.ActivityOptionsCompat
|
||||||
import androidx.core.view.isGone
|
import androidx.core.view.isGone
|
||||||
import androidx.fragment.app.activityViewModels
|
import androidx.fragment.app.activityViewModels
|
||||||
import androidx.lifecycle.Lifecycle
|
import androidx.lifecycle.Lifecycle
|
||||||
@@ -22,10 +26,13 @@ import io.legato.kazusa.data.appDb
|
|||||||
import io.legato.kazusa.data.entities.Book
|
import io.legato.kazusa.data.entities.Book
|
||||||
import io.legato.kazusa.data.entities.BookGroup
|
import io.legato.kazusa.data.entities.BookGroup
|
||||||
import io.legato.kazusa.databinding.FragmentBooksBinding
|
import io.legato.kazusa.databinding.FragmentBooksBinding
|
||||||
|
import io.legato.kazusa.help.book.isAudio
|
||||||
|
import io.legato.kazusa.help.book.isImage
|
||||||
import io.legato.kazusa.help.config.AppConfig
|
import io.legato.kazusa.help.config.AppConfig
|
||||||
//import io.legado.app.lib.theme.accentColor
|
import io.legato.kazusa.ui.book.audio.AudioPlayActivity
|
||||||
//import io.legado.app.lib.theme.primaryColor
|
|
||||||
import io.legato.kazusa.ui.book.info.BookInfoActivity
|
import io.legato.kazusa.ui.book.info.BookInfoActivity
|
||||||
|
import io.legato.kazusa.ui.book.manga.ReadMangaActivity
|
||||||
|
import io.legato.kazusa.ui.book.read.ReadBookActivity
|
||||||
import io.legato.kazusa.ui.main.MainViewModel
|
import io.legato.kazusa.ui.main.MainViewModel
|
||||||
import io.legato.kazusa.ui.main.bookshelf.books.styleDefalut.BaseBooksAdapter
|
import io.legato.kazusa.ui.main.bookshelf.books.styleDefalut.BaseBooksAdapter
|
||||||
import io.legato.kazusa.ui.main.bookshelf.books.styleDefalut.BooksAdapterGrid
|
import io.legato.kazusa.ui.main.bookshelf.books.styleDefalut.BooksAdapterGrid
|
||||||
@@ -34,8 +41,6 @@ import io.legato.kazusa.utils.bookshelfLayout
|
|||||||
import io.legato.kazusa.utils.cnCompare
|
import io.legato.kazusa.utils.cnCompare
|
||||||
import io.legato.kazusa.utils.flowWithLifecycleAndDatabaseChangeFirst
|
import io.legato.kazusa.utils.flowWithLifecycleAndDatabaseChangeFirst
|
||||||
import io.legato.kazusa.utils.observeEvent
|
import io.legato.kazusa.utils.observeEvent
|
||||||
import io.legato.kazusa.utils.startActivity
|
|
||||||
import io.legato.kazusa.utils.startActivityForBook
|
|
||||||
import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
|
import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
@@ -150,11 +155,8 @@ class BooksFragment() : BaseFragment(R.layout.fragment_books),
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun upBookSort() {
|
fun upBookSort() {
|
||||||
// binding.root.post {
|
bookSort = AppConfig.bookshelfSort
|
||||||
// arguments?.putInt("bookSort", sort)
|
|
||||||
// bookSort = sort
|
|
||||||
upRecyclerData()
|
upRecyclerData()
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setEnableRefresh(enable: Boolean) {
|
fun setEnableRefresh(enable: Boolean) {
|
||||||
@@ -255,17 +257,49 @@ class BooksFragment() : BaseFragment(R.layout.fragment_books),
|
|||||||
binding.rvBookshelf.adapter = null
|
binding.rvBookshelf.adapter = null
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun open(book: Book) {
|
override fun open(book: Book, sharedView: View) {
|
||||||
startActivityForBook(book)
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun openBookInfo(book: Book) {
|
val intent = Intent(requireContext(), cls).apply {
|
||||||
startActivity<BookInfoActivity> {
|
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("name", book.name)
|
||||||
putExtra("author", book.author)
|
putExtra("author", book.author)
|
||||||
|
putExtra("transitionName", "book_${book.bookUrl}") // 给共享元素唯一标识
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sharedView.transitionName = "book_${book.bookUrl}"
|
||||||
|
|
||||||
|
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(
|
||||||
|
requireActivity(),
|
||||||
|
sharedView,
|
||||||
|
sharedView.transitionName
|
||||||
|
)
|
||||||
|
|
||||||
|
startActivity(intent, options.toBundle())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun isUpdate(bookUrl: String): Boolean {
|
override fun isUpdate(bookUrl: String): Boolean {
|
||||||
return activityViewModel.isUpdate(bookUrl)
|
return activityViewModel.isUpdate(bookUrl)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
package io.legato.kazusa.ui.main.bookshelf.books
|
package io.legato.kazusa.ui.main.bookshelf.books
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.appcompat.widget.SearchView
|
import androidx.appcompat.widget.SearchView
|
||||||
|
import androidx.core.app.ActivityOptionsCompat
|
||||||
import androidx.core.view.isGone
|
import androidx.core.view.isGone
|
||||||
import androidx.lifecycle.Lifecycle
|
import androidx.lifecycle.Lifecycle
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
@@ -19,9 +21,14 @@ import io.legato.kazusa.data.appDb
|
|||||||
import io.legato.kazusa.data.entities.Book
|
import io.legato.kazusa.data.entities.Book
|
||||||
import io.legato.kazusa.data.entities.BookGroup
|
import io.legato.kazusa.data.entities.BookGroup
|
||||||
import io.legato.kazusa.databinding.FragmentBookshelf2Binding
|
import io.legato.kazusa.databinding.FragmentBookshelf2Binding
|
||||||
|
import io.legato.kazusa.help.book.isAudio
|
||||||
|
import io.legato.kazusa.help.book.isImage
|
||||||
import io.legato.kazusa.help.config.AppConfig
|
import io.legato.kazusa.help.config.AppConfig
|
||||||
|
import io.legato.kazusa.ui.book.audio.AudioPlayActivity
|
||||||
import io.legato.kazusa.ui.book.group.GroupEditDialog
|
import io.legato.kazusa.ui.book.group.GroupEditDialog
|
||||||
import io.legato.kazusa.ui.book.info.BookInfoActivity
|
import io.legato.kazusa.ui.book.info.BookInfoActivity
|
||||||
|
import io.legato.kazusa.ui.book.manga.ReadMangaActivity
|
||||||
|
import io.legato.kazusa.ui.book.read.ReadBookActivity
|
||||||
import io.legato.kazusa.ui.book.search.SearchActivity
|
import io.legato.kazusa.ui.book.search.SearchActivity
|
||||||
import io.legato.kazusa.ui.main.bookshelf.BaseBookshelfFragment
|
import io.legato.kazusa.ui.main.bookshelf.BaseBookshelfFragment
|
||||||
import io.legato.kazusa.ui.main.bookshelf.books.styleFold.BaseBooksAdapter
|
import io.legato.kazusa.ui.main.bookshelf.books.styleFold.BaseBooksAdapter
|
||||||
@@ -32,8 +39,6 @@ import io.legato.kazusa.utils.cnCompare
|
|||||||
import io.legato.kazusa.utils.flowWithLifecycleAndDatabaseChangeFirst
|
import io.legato.kazusa.utils.flowWithLifecycleAndDatabaseChangeFirst
|
||||||
import io.legato.kazusa.utils.observeEvent
|
import io.legato.kazusa.utils.observeEvent
|
||||||
import io.legato.kazusa.utils.showDialogFragment
|
import io.legato.kazusa.utils.showDialogFragment
|
||||||
import io.legato.kazusa.utils.startActivity
|
|
||||||
import io.legato.kazusa.utils.startActivityForBook
|
|
||||||
import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
|
import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
@@ -249,9 +254,31 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onItemClick(item: Any) {
|
override fun onItemClick(item: Any, sharedView: View) {
|
||||||
when (item) {
|
when (item) {
|
||||||
is Book -> startActivityForBook(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 intent = Intent(requireContext(), cls).apply {
|
||||||
|
putExtra("bookUrl", item.bookUrl)
|
||||||
|
putExtra("transitionName", transitionName)
|
||||||
|
}
|
||||||
|
|
||||||
|
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(
|
||||||
|
requireActivity(),
|
||||||
|
sharedView,
|
||||||
|
transitionName
|
||||||
|
)
|
||||||
|
|
||||||
|
startActivity(intent, options.toBundle())
|
||||||
|
}
|
||||||
|
|
||||||
is BookGroup -> {
|
is BookGroup -> {
|
||||||
groupId = item.groupId
|
groupId = item.groupId
|
||||||
@@ -260,11 +287,24 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onItemLongClick(item: Any) {
|
override fun onItemLongClick(item: Any, sharedView: View) {
|
||||||
when (item) {
|
when (item) {
|
||||||
is Book -> startActivity<BookInfoActivity> {
|
is Book -> {
|
||||||
|
val intent = Intent(requireContext(), BookInfoActivity::class.java).apply {
|
||||||
putExtra("name", item.name)
|
putExtra("name", item.name)
|
||||||
putExtra("author", item.author)
|
putExtra("author", item.author)
|
||||||
|
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))
|
||||||
|
|||||||
+3
-2
@@ -1,6 +1,7 @@
|
|||||||
package io.legato.kazusa.ui.main.bookshelf.books.styleDefalut
|
package io.legato.kazusa.ui.main.bookshelf.books.styleDefalut
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.view.View
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.recyclerview.widget.DiffUtil
|
import androidx.recyclerview.widget.DiffUtil
|
||||||
import androidx.viewbinding.ViewBinding
|
import androidx.viewbinding.ViewBinding
|
||||||
@@ -86,8 +87,8 @@ abstract class BaseBooksAdapter<VB : ViewBinding>(context: Context) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface CallBack {
|
interface CallBack {
|
||||||
fun open(book: Book)
|
fun open(book: Book, sharedView: View)
|
||||||
fun openBookInfo(book: Book)
|
fun openBookInfo(book: Book, sharedView: View)
|
||||||
fun isUpdate(bookUrl: String): Boolean
|
fun isUpdate(bookUrl: String): Boolean
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+4
-2
@@ -23,6 +23,7 @@ class BooksAdapterGrid(context: Context, private val callBack: CallBack) :
|
|||||||
item: Book,
|
item: Book,
|
||||||
payloads: MutableList<Any>
|
payloads: MutableList<Any>
|
||||||
) = binding.run {
|
) = binding.run {
|
||||||
|
binding.ivCover.transitionName = "book_${item.bookUrl}"
|
||||||
if (payloads.isEmpty()) {
|
if (payloads.isEmpty()) {
|
||||||
tvName.text = item.name
|
tvName.text = item.name
|
||||||
ivCover.load(item.getDisplayCover(), item.name, item.author, false, item.origin)
|
ivCover.load(item.getDisplayCover(), item.name, item.author, false, item.origin)
|
||||||
@@ -62,15 +63,16 @@ class BooksAdapterGrid(context: Context, private val callBack: CallBack) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun registerListener(holder: ItemViewHolder, binding: ItemBookshelfGridBinding) {
|
override fun registerListener(holder: ItemViewHolder, binding: ItemBookshelfGridBinding) {
|
||||||
|
|
||||||
binding.cvContent.setOnClickListener {
|
binding.cvContent.setOnClickListener {
|
||||||
getItem(holder.layoutPosition)?.let {
|
getItem(holder.layoutPosition)?.let {
|
||||||
callBack.open(it)
|
callBack.open(it, binding.ivCover)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.cvContent.setOnLongClickListener {
|
binding.cvContent.setOnLongClickListener {
|
||||||
getItem(holder.layoutPosition)?.let {
|
getItem(holder.layoutPosition)?.let {
|
||||||
callBack.openBookInfo(it)
|
callBack.openBookInfo(it, binding.ivCover)
|
||||||
}
|
}
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-2
@@ -31,6 +31,7 @@ class BooksAdapterList(
|
|||||||
item: Book,
|
item: Book,
|
||||||
payloads: MutableList<Any>
|
payloads: MutableList<Any>
|
||||||
) = binding.run {
|
) = binding.run {
|
||||||
|
binding.ivCover.transitionName = "book_${item.bookUrl}"
|
||||||
if (payloads.isEmpty()) {
|
if (payloads.isEmpty()) {
|
||||||
tvName.text = item.name
|
tvName.text = item.name
|
||||||
tvAuthor.text = item.author
|
tvAuthor.text = item.author
|
||||||
@@ -97,13 +98,13 @@ class BooksAdapterList(
|
|||||||
holder.itemView.apply {
|
holder.itemView.apply {
|
||||||
binding.cvContent.setOnClickListener {
|
binding.cvContent.setOnClickListener {
|
||||||
getItem(holder.layoutPosition)?.let {
|
getItem(holder.layoutPosition)?.let {
|
||||||
callBack.open(it)
|
callBack.open(it, binding.ivCover)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.cvContent.onLongClick {
|
binding.cvContent.onLongClick {
|
||||||
getItem(holder.layoutPosition)?.let {
|
getItem(holder.layoutPosition)?.let {
|
||||||
callBack.openBookInfo(it)
|
callBack.openBookInfo(it, binding.ivCover)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-2
@@ -2,6 +2,7 @@ package io.legato.kazusa.ui.main.bookshelf.books.styleFold
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.recyclerview.widget.AsyncListDiffer
|
import androidx.recyclerview.widget.AsyncListDiffer
|
||||||
import androidx.recyclerview.widget.DiffUtil
|
import androidx.recyclerview.widget.DiffUtil
|
||||||
@@ -138,8 +139,8 @@ abstract class BaseBooksAdapter<VH : RecyclerView.ViewHolder>(
|
|||||||
|
|
||||||
|
|
||||||
interface CallBack {
|
interface CallBack {
|
||||||
fun onItemClick(item: Any)
|
fun onItemClick(item: Any, sharedView: View)
|
||||||
fun onItemLongClick(item: Any)
|
fun onItemLongClick(item: Any, sharedView: View)
|
||||||
fun isUpdate(bookUrl: String): Boolean
|
fun isUpdate(bookUrl: String): Boolean
|
||||||
fun getItems(): List<Any>
|
fun getItems(): List<Any>
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -92,10 +92,10 @@ class BooksAdapterGrid(context: Context, callBack: CallBack) :
|
|||||||
|
|
||||||
fun registerListener(item: Any) {
|
fun registerListener(item: Any) {
|
||||||
binding.cvContent.setOnClickListener {
|
binding.cvContent.setOnClickListener {
|
||||||
callBack.onItemClick(item)
|
callBack.onItemClick(item, binding.ivCover)
|
||||||
}
|
}
|
||||||
binding.cvContent.onLongClick {
|
binding.cvContent.onLongClick {
|
||||||
callBack.onItemLongClick(item)
|
callBack.onItemLongClick(item, binding.ivCover)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,10 +149,10 @@ class BooksAdapterGrid(context: Context, callBack: CallBack) :
|
|||||||
|
|
||||||
fun registerListener(item: Any) {
|
fun registerListener(item: Any) {
|
||||||
binding.cvContent.setOnClickListener {
|
binding.cvContent.setOnClickListener {
|
||||||
callBack.onItemClick(item)
|
callBack.onItemClick(item, binding.ivCover)
|
||||||
}
|
}
|
||||||
binding.cvContent.onLongClick {
|
binding.cvContent.onLongClick {
|
||||||
callBack.onItemLongClick(item)
|
callBack.onItemLongClick(item, binding.ivCover)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -113,10 +113,10 @@ class BooksAdapterList(context: Context, callBack: CallBack) :
|
|||||||
|
|
||||||
fun registerListener(item: Any) {
|
fun registerListener(item: Any) {
|
||||||
binding.cvContent.setOnClickListener {
|
binding.cvContent.setOnClickListener {
|
||||||
callBack.onItemClick(item)
|
callBack.onItemClick(item, binding.ivCover)
|
||||||
}
|
}
|
||||||
binding.cvContent.onLongClick {
|
binding.cvContent.onLongClick {
|
||||||
callBack.onItemLongClick(item)
|
callBack.onItemLongClick(item, binding.ivCover)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,10 +166,10 @@ class BooksAdapterList(context: Context, callBack: CallBack) :
|
|||||||
|
|
||||||
fun registerListener(item: Any) {
|
fun registerListener(item: Any) {
|
||||||
binding.cvContent.setOnClickListener {
|
binding.cvContent.setOnClickListener {
|
||||||
callBack.onItemClick(item)
|
callBack.onItemClick(item, binding.ivCover)
|
||||||
}
|
}
|
||||||
binding.cvContent.onLongClick {
|
binding.cvContent.onLongClick {
|
||||||
callBack.onItemLongClick(item)
|
callBack.onItemLongClick(item, binding.ivCover)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -65,12 +65,6 @@ class ExploreAdapter(context: Context, val callBack: CallBack) :
|
|||||||
item.exploreKinds()
|
item.exploreKinds()
|
||||||
}.onSuccess { kindList ->
|
}.onSuccess { kindList ->
|
||||||
upKindList(flexbox, item.bookSourceUrl, kindList)
|
upKindList(flexbox, item.bookSourceUrl, kindList)
|
||||||
}.onFinally {
|
|
||||||
|
|
||||||
if (scrollTo >= 0) {
|
|
||||||
callBack.scrollTo(scrollTo)
|
|
||||||
scrollTo = -1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ivStatus.icon = ContextCompat.getDrawable(context, R.drawable.ic_arrow_right)
|
ivStatus.icon = ContextCompat.getDrawable(context, R.drawable.ic_arrow_right)
|
||||||
|
|||||||
@@ -1,16 +1,15 @@
|
|||||||
package io.legato.kazusa.ui.main.explore
|
package io.legato.kazusa.ui.main.explore
|
||||||
|
|
||||||
|
//import io.legado.app.lib.theme.primaryColor
|
||||||
|
//import io.legado.app.lib.theme.primaryTextColor
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.Menu
|
import android.view.Menu
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import android.view.SubMenu
|
import android.view.SubMenu
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.inputmethod.EditorInfo
|
import android.view.inputmethod.EditorInfo
|
||||||
import androidx.core.view.ViewCompat
|
|
||||||
import androidx.core.view.WindowInsetsCompat
|
|
||||||
import androidx.core.view.isGone
|
import androidx.core.view.isGone
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.core.view.updatePadding
|
|
||||||
import androidx.core.widget.doAfterTextChanged
|
import androidx.core.widget.doAfterTextChanged
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import androidx.lifecycle.Lifecycle
|
import androidx.lifecycle.Lifecycle
|
||||||
@@ -29,8 +28,6 @@ import io.legato.kazusa.data.entities.BookSourcePart
|
|||||||
import io.legato.kazusa.databinding.FragmentExploreBinding
|
import io.legato.kazusa.databinding.FragmentExploreBinding
|
||||||
import io.legato.kazusa.help.config.AppConfig
|
import io.legato.kazusa.help.config.AppConfig
|
||||||
import io.legato.kazusa.lib.dialogs.alert
|
import io.legato.kazusa.lib.dialogs.alert
|
||||||
//import io.legado.app.lib.theme.primaryColor
|
|
||||||
//import io.legado.app.lib.theme.primaryTextColor
|
|
||||||
import io.legato.kazusa.ui.book.explore.ExploreShowActivity
|
import io.legato.kazusa.ui.book.explore.ExploreShowActivity
|
||||||
import io.legato.kazusa.ui.book.search.SearchActivity
|
import io.legato.kazusa.ui.book.search.SearchActivity
|
||||||
import io.legato.kazusa.ui.book.search.SearchScope
|
import io.legato.kazusa.ui.book.search.SearchScope
|
||||||
@@ -103,10 +100,8 @@ class ExploreFragment() : VMBaseFragment<ExploreViewModel>(R.layout.fragment_exp
|
|||||||
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
|
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
|
||||||
val query = searchView.text.toString()
|
val query = searchView.text.toString()
|
||||||
upExploreData(query)
|
upExploreData(query)
|
||||||
searchBar.hint = if (query.isEmpty()) {
|
searchBar.hint = query.ifEmpty {
|
||||||
getString(R.string.screen_find)
|
getString(R.string.screen_find)
|
||||||
} else {
|
|
||||||
query
|
|
||||||
}
|
}
|
||||||
searchView.hide()
|
searchView.hide()
|
||||||
return@setOnEditorActionListener true
|
return@setOnEditorActionListener true
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/root_view"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<FrameLayout 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/root_view"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<style name="Base.AppTheme" parent="Theme.Material3Expressive.DynamicColors.DayNight.NoActionBar">
|
<style name="Base.AppTheme" parent="Theme.Material3Expressive.DynamicColors.DayNight.NoActionBar">
|
||||||
|
<item name="android:windowActivityTransitions">true</item>
|
||||||
|
<item name="android:windowContentTransitions">true</item>
|
||||||
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
|
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
|
||||||
<item name="android:windowLightStatusBar">false</item>
|
<item name="android:windowLightStatusBar">false</item>
|
||||||
<item name="tabStyle">@style/Widget.App.TabLayout</item>
|
<item name="tabStyle">@style/Widget.App.TabLayout</item>
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
//**************************************************************Theme******************************************************************************//
|
//**************************************************************Theme******************************************************************************//
|
||||||
|
|
||||||
<style name="Base.AppTheme" parent="Theme.Material3Expressive.DynamicColors.DayNight.NoActionBar">
|
<style name="Base.AppTheme" parent="Theme.Material3Expressive.DynamicColors.DayNight.NoActionBar">
|
||||||
|
<item name="android:windowActivityTransitions">true</item>
|
||||||
|
<item name="android:windowContentTransitions">true</item>
|
||||||
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
|
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
|
||||||
<item name="android:windowLightStatusBar">true</item>
|
<item name="android:windowLightStatusBar">true</item>
|
||||||
<item name="tabStyle">@style/Widget.App.TabLayout</item>
|
<item name="tabStyle">@style/Widget.App.TabLayout</item>
|
||||||
|
|||||||
Reference in new issue
Block a user