From e0d45961f8f41cc81f7ed79f2bce6977c814f0e8 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 18 Apr 2020 10:56:34 +0300 Subject: [PATCH] Add some animations --- .idea/codeStyles/Project.xml | 1 - .idea/inspectionProfiles/Project_Default.xml | 6 ++++ app/build.gradle | 10 +++--- .../kotatsu/core/prefs/AppSettings.kt | 5 +++ .../kotatsu/ui/details/ChaptersFragment.kt | 10 +++++- .../koitharu/kotatsu/ui/main/MainActivity.kt | 14 ++++++-- .../kotatsu/ui/main/list/MangaListFragment.kt | 1 + .../ui/reader/standard/PageAnimTransformer.kt | 36 +++++++++++++++++++ .../ui/reader/standard/PagerReaderFragment.kt | 33 ++++++++++++++++- .../res/layout/dialog_favorite_categories.xml | 1 + app/src/main/res/values-ru/strings.xml | 3 +- app/src/main/res/values/constants.xml | 1 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/pref_main.xml | 6 ++++ app/src/main/res/xml/pref_reader.xml | 6 ++++ build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 +-- 17 files changed, 126 insertions(+), 14 deletions(-) create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/PageAnimTransformer.kt diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index bda8001d6..87bd3a768 100755 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -23,7 +23,6 @@ - diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 000000000..e520b8638 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 049601360..b482b7197 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -61,16 +61,16 @@ dependencies { implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3' - implementation 'androidx.core:core-ktx:1.3.0-beta01' + implementation 'androidx.core:core-ktx:1.3.0-rc01' implementation 'androidx.fragment:fragment-ktx:1.2.4' implementation 'androidx.appcompat:appcompat:1.2.0-beta01' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4' - implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-beta01' + implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-rc01' implementation 'androidx.recyclerview:recyclerview:1.2.0-alpha02' implementation 'androidx.viewpager2:viewpager2:1.1.0-alpha01' - implementation 'androidx.preference:preference:1.1.0' + implementation 'androidx.preference:preference-ktx:1.1.1' implementation 'androidx.work:work-runtime-ktx:2.3.4' - implementation 'com.google.android.material:material:1.2.0-alpha05' + implementation 'com.google.android.material:material:1.2.0-alpha06' implementation 'androidx.room:room-runtime:2.2.5' implementation 'androidx.room:room-ktx:2.2.5' @@ -86,7 +86,7 @@ dependencies { implementation 'com.squareup.okio:okio:2.5.0' implementation 'org.jsoup:jsoup:1.13.1' - implementation 'org.koin:koin-android:2.1.4' + implementation 'org.koin:koin-android:2.1.5' implementation 'io.coil-kt:coil:0.9.5' implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.10.0' implementation 'com.tomclaw.cache:cache:1.0' diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt index f3bdb6e05..22d02b08b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -73,6 +73,11 @@ class AppSettings private constructor(resources: Resources, private val prefs: S true ) + val readerAnimation by BoolPreferenceDelegate( + resources.getString(R.string.key_reader_animation), + false + ) + private var sourcesOrderStr by NullableStringPreferenceDelegate(resources.getString(R.string.key_sources_order)) var sourcesOrder: List diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/ChaptersFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/ChaptersFragment.kt index 84585a070..0dec517ec 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/ChaptersFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/ChaptersFragment.kt @@ -1,5 +1,6 @@ package org.koitharu.kotatsu.ui.details +import android.app.ActivityOptions import android.os.Bundle import android.view.View import androidx.core.view.isVisible @@ -68,12 +69,19 @@ class ChaptersFragment : BaseFragment(R.layout.fragment_chapters), MangaDetailsV override fun onFavouriteChanged(categories: List) = Unit override fun onItemClick(item: MangaChapter, position: Int, view: View) { + val options = ActivityOptions.makeScaleUpAnimation( + view, + 0, + 0, + view.measuredWidth, + view.measuredHeight + ) startActivity( ReaderActivity.newIntent( context ?: return, manga ?: return, item.id - ) + ), options.toBundle() ) } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/main/MainActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/main/MainActivity.kt index f68e9558f..1e16a5811 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/main/MainActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/main/MainActivity.kt @@ -1,9 +1,11 @@ package org.koitharu.kotatsu.ui.main +import android.app.ActivityOptions import android.content.SharedPreferences import android.content.res.ColorStateList import android.content.res.Configuration import android.graphics.Color +import android.os.Build import android.os.Bundle import android.view.Menu import android.view.MenuItem @@ -45,7 +47,6 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - drawerToggle = ActionBarDrawerToggle(this, drawer, toolbar, R.string.open_menu, R.string.close_menu) drawer.addDrawerListener(drawerToggle) @@ -119,7 +120,16 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList } override fun onOpenReader(state: ReaderState) { - startActivity(ReaderActivity.newIntent(this, state)) + val options = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + ActivityOptions.makeClipRevealAnimation( + fab, 0, 0, fab.measuredWidth, fab.measuredHeight + ) + } else { + ActivityOptions.makeScaleUpAnimation( + fab, 0, 0, fab.measuredWidth, fab.measuredHeight + ) + } + startActivity(ReaderActivity.newIntent(this, state), options?.toBundle()) } override fun onError(e: Throwable) { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/main/list/MangaListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/MangaListFragment.kt index 2f34178be..d94f1500c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/main/list/MangaListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/MangaListFragment.kt @@ -237,6 +237,7 @@ abstract class MangaListFragment : BaseFragment(R.layout.fragment_list), Mang ListMode.GRID -> GridLayoutManager(ctx, UiUtils.resolveGridSpanCount(ctx)) else -> LinearLayoutManager(ctx) } + recyclerView.recycledViewPool.clear() recyclerView.adapter = adapter recyclerView.addItemDecoration( when (mode) { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/PageAnimTransformer.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/PageAnimTransformer.kt new file mode 100644 index 000000000..584f7cf64 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/PageAnimTransformer.kt @@ -0,0 +1,36 @@ +package org.koitharu.kotatsu.ui.reader.standard + +import android.view.View +import androidx.viewpager2.widget.ViewPager2 + +class PageAnimTransformer : ViewPager2.PageTransformer { + + override fun transformPage(page: View, position: Float) { + page.apply { + val pageWidth = width + when { + position < -1 -> alpha = 0f + position <= 0 -> { // [-1,0] + alpha = 1f + translationX = 0f + translationZ = 0f + scaleX = 1 + FACTOR * position + scaleY = 1f + } + position <= 1 -> { // (0,1] + alpha = 1f + translationX = pageWidth * -position + translationZ = -1f + scaleX = 1f + scaleY = 1f + } + else -> alpha = 0f + } + } + } + + private companion object { + + const val FACTOR = 0.1f + } +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/PagerReaderFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/PagerReaderFragment.kt index 934966e6f..a0168839d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/PagerReaderFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/PagerReaderFragment.kt @@ -1,10 +1,14 @@ package org.koitharu.kotatsu.ui.reader.standard +import android.content.Context +import android.content.SharedPreferences import android.os.Bundle import android.view.View import kotlinx.android.synthetic.main.fragment_reader_standard.* +import org.koin.android.ext.android.inject import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.MangaPage +import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.ui.reader.ReaderState import org.koitharu.kotatsu.ui.reader.base.AbstractReader import org.koitharu.kotatsu.ui.reader.base.BaseReaderAdapter @@ -12,19 +16,34 @@ import org.koitharu.kotatsu.ui.reader.base.GroupedList import org.koitharu.kotatsu.utils.ext.doOnPageChanged import org.koitharu.kotatsu.utils.ext.withArgs -class PagerReaderFragment : AbstractReader(R.layout.fragment_reader_standard) { +class PagerReaderFragment : AbstractReader(R.layout.fragment_reader_standard), + SharedPreferences.OnSharedPreferenceChangeListener { private var paginationListener: PagerPaginationListener? = null + private val settings by inject() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) paginationListener = PagerPaginationListener(adapter!!, 2, this) pager.adapter = adapter + if (settings.readerAnimation) { + pager.setPageTransformer(PageAnimTransformer()) + } pager.offscreenPageLimit = 2 pager.registerOnPageChangeCallback(paginationListener!!) pager.doOnPageChanged(::notifyPageChanged) } + override fun onAttach(context: Context) { + super.onAttach(context) + settings.subscribe(this) + } + + override fun onDetach() { + settings.unsubscribe(this) + super.onDetach() + } + override fun onDestroyView() { paginationListener = null super.onDestroyView() @@ -47,6 +66,18 @@ class PagerReaderFragment : AbstractReader(R.layout.fragment_reader_standard) { override fun restorePageScroll(position: Int, scroll: Float) = Unit + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + when (key) { + getString(R.string.key_reader_animation) -> { + if (settings.readerAnimation) { + pager.setPageTransformer(PageAnimTransformer()) + } else { + pager.setPageTransformer(null) + } + } + } + } + companion object { fun newInstance(state: ReaderState) = PagerReaderFragment().withArgs(1) { diff --git a/app/src/main/res/layout/dialog_favorite_categories.xml b/app/src/main/res/layout/dialog_favorite_categories.xml index 3c0668c4c..bb45c4550 100644 --- a/app/src/main/res/layout/dialog_favorite_categories.xml +++ b/app/src/main/res/layout/dialog_favorite_categories.xml @@ -26,6 +26,7 @@ android:layout_height="wrap_content" android:orientation="vertical" android:scrollbars="vertical" + android:overScrollMode="never" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" tools:listitem="@layout/item_category_checkable" /> diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index ac2d48d4a..817bc82bf 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -131,5 +131,6 @@ Здесь будет оборажаться манга, которую Вы читаете. Вы можете найти, что почитать, в боковом меню У Вас пока нет сохранённой манги. Вы можете сохранить мангу из онлайн каталога или импортировать из файла Полка с мангой - Recent manga + Недавняя манга + Анимация листания \ No newline at end of file diff --git a/app/src/main/res/values/constants.xml b/app/src/main/res/values/constants.xml index 16921fa9d..f46ccf0fc 100644 --- a/app/src/main/res/values/constants.xml +++ b/app/src/main/res/values/constants.xml @@ -19,6 +19,7 @@ notifications_sound notifications_vibrate notifications_light + reader_animation domain diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ae01da578..0a1b6791f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -133,4 +133,5 @@ You have not any saved manga yet. You can save it from online sources or import from file Manga shelf Recent manga + Pages animation \ No newline at end of file diff --git a/app/src/main/res/xml/pref_main.xml b/app/src/main/res/xml/pref_main.xml index 23e193ef6..65e159f2d 100644 --- a/app/src/main/res/xml/pref_main.xml +++ b/app/src/main/res/xml/pref_main.xml @@ -51,6 +51,12 @@ app:allowDividerAbove="true" app:iconSpaceReserved="false" /> + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 30ef65d92..34514cebf 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { } } dependencies { - classpath 'com.android.tools.build:gradle:4.1.0-alpha05' + classpath 'com.android.tools.build:gradle:4.1.0-alpha06' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 19bece88e..6abb2b438 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Mar 28 11:01:15 EET 2020 +#Sat Apr 18 10:00:24 EEST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.4-rc-1-all.zip