From 137c21e6c9446e918bd42dd4b3772a1a6821eb39 Mon Sep 17 00:00:00 2001 From: NoodleMage Date: Sat, 19 Mar 2016 15:39:19 +0100 Subject: [PATCH] Added animation --- .../ui/manga/chapter/ChaptersFragment.kt | 34 +++++++- .../kanade/tachiyomi/util/ViewExtensions.kt | 19 +++++ .../tachiyomi/widget/RevealAnimationView.kt | 79 +++++++++++++++++++ .../res/layout/fragment_manga_chapters.xml | 9 +++ app/src/main/res/layout/item_chapter.xml | 18 ++--- 5 files changed, 147 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/util/ViewExtensions.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/widget/RevealAnimationView.kt diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersFragment.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersFragment.kt index 83c22e7341..90c0dc3095 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersFragment.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersFragment.kt @@ -1,5 +1,8 @@ package eu.kanade.tachiyomi.ui.manga.chapter +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.content.Intent import android.os.Bundle import android.support.v7.view.ActionMode import android.support.v7.widget.LinearLayoutManager @@ -16,6 +19,7 @@ import eu.kanade.tachiyomi.ui.base.decoration.DividerItemDecoration import eu.kanade.tachiyomi.ui.base.fragment.BaseRxFragment import eu.kanade.tachiyomi.ui.manga.MangaActivity import eu.kanade.tachiyomi.ui.reader.ReaderActivity +import eu.kanade.tachiyomi.util.getCoordinates import eu.kanade.tachiyomi.util.getResourceDrawable import eu.kanade.tachiyomi.util.toast import kotlinx.android.synthetic.main.fragment_manga_chapters.* @@ -73,7 +77,19 @@ class ChaptersFragment : BaseRxFragment(), ActionMode.Callbac fab.setOnClickListener { v -> val chapter = presenter.getNextUnreadChapter() if (chapter != null) { - openChapter(chapter) + // Create animation listener + var revealAnimationListener: Animator.AnimatorListener = object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + // On done open chapter + openChapter(chapter, true) + } + } + + // Get coordinates and start animation + val coordinates = fab.getCoordinates() + if (!reveal_view.showRevealEffect(coordinates.x, coordinates.y, revealAnimationListener)) { + openChapter(chapter) + } } else { context.toast(R.string.no_next_chapter) } @@ -90,6 +106,16 @@ class ChaptersFragment : BaseRxFragment(), ActionMode.Callbac super.onPause() } + override fun onResume() { + // Check if animation view is visible + if (reveal_view.visibility == View.VISIBLE) { + // Show the unReveal effect + var coordinates = fab.getCoordinates() + reveal_view.hideRevealEffect(coordinates.x, coordinates.y, 1920) + } + super.onResume() + } + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.chapters, menu) menu.findItem(R.id.action_filter_unread).isChecked = presenter.onlyUnread() @@ -159,9 +185,12 @@ class ChaptersFragment : BaseRxFragment(), ActionMode.Callbac val isCatalogueManga: Boolean get() = (activity as MangaActivity).isCatalogueManga - protected fun openChapter(chapter: Chapter) { + protected fun openChapter(chapter: Chapter, hasAnimation: Boolean = false) { presenter.onOpenChapter(chapter) val intent = ReaderActivity.newIntent(activity) + if (hasAnimation) { + intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION) + } startActivity(intent) } @@ -349,5 +378,4 @@ class ChaptersFragment : BaseRxFragment(), ActionMode.Callbac fun setDownloadedFilter() { this.activity.supportInvalidateOptionsMenu() } - } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/ViewExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/ViewExtensions.kt new file mode 100644 index 0000000000..a2f1c5d702 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/util/ViewExtensions.kt @@ -0,0 +1,19 @@ +package eu.kanade.tachiyomi.util + +import android.graphics.Point +import android.view.View + +/** + * Returns coordinates of view. + * Used for animation + * + * @return coordinates of view + */ +fun View.getCoordinates(): Point +{ + var cx = (this.left + this.right) / 2; + var cy = (this.top + this.bottom) / 2; + + return Point(cx, cy) +} + diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/RevealAnimationView.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/RevealAnimationView.kt new file mode 100644 index 0000000000..f5718e75df --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/RevealAnimationView.kt @@ -0,0 +1,79 @@ +package eu.kanade.tachiyomi.widget + +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.annotation.TargetApi +import android.content.Context +import android.os.Build +import android.util.AttributeSet +import android.view.View +import android.view.ViewAnimationUtils + +@TargetApi(Build.VERSION_CODES.LOLLIPOP) +class RevealAnimationView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : + View(context, attrs) { + + /** + * Hides the animation view with a animation + * + * @param centerX x starting point + * @param centerY y starting point + * @param initialRadius size of radius of animation + */ + fun hideRevealEffect(centerX: Int, centerY: Int, initialRadius: Int) { + if (Build.VERSION.SDK_INT >= 21) { + + // Make the view visible. + this.visibility = View.VISIBLE + + // Create the animation (the final radius is zero). + val anim = ViewAnimationUtils.createCircularReveal( + this, centerX, centerY, initialRadius.toFloat(), 0f) + + // Set duration of animation. + anim.duration = 500 + + // make the view invisible when the animation is done + anim.addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + super.onAnimationEnd(animation) + this@RevealAnimationView.visibility = View.INVISIBLE + } + }) + + anim.start() + } + } + + /** + * Fills the animation view with a animation + * + * @param centerX x starting point + * @param centerY y starting point + * @param listener animation listener + * + * @return sdk version lower then 21 + */ + fun showRevealEffect(centerX: Int, centerY: Int, listener: Animator.AnimatorListener): Boolean { + if (Build.VERSION.SDK_INT >= 21) { + + this.visibility = View.VISIBLE + + val height = this.height + + // Create animation + val anim = ViewAnimationUtils.createCircularReveal( + this, centerX, centerY, 0f, height.toFloat()) + + // Set duration of animation + anim.duration = 350 + + anim.addListener(listener) + anim.start() + return true + } + return false + } + + +} diff --git a/app/src/main/res/layout/fragment_manga_chapters.xml b/app/src/main/res/layout/fragment_manga_chapters.xml index b62c2bf33f..d3a25fdff8 100644 --- a/app/src/main/res/layout/fragment_manga_chapters.xml +++ b/app/src/main/res/layout/fragment_manga_chapters.xml @@ -7,6 +7,15 @@ android:layout_height="match_parent" android:orientation="vertical"> + + @@ -25,37 +25,38 @@ + android:textAllCaps="true"/> @@ -93,8 +93,8 @@ android:layout_alignParentEnd="false" android:layout_alignParentRight="true" android:layout_alignParentTop="true" - app:srcCompat="@drawable/ic_more_horiz_black_24dp" - android:tint="?android:attr/textColorPrimary"/> + android:tint="?android:attr/textColorPrimary" + app:srcCompat="@drawable/ic_more_horiz_black_24dp"/>