Antoine POPINEAU
4 years ago
8 changed files with 49 additions and 123 deletions
@ -1,79 +0,0 @@
@@ -1,79 +0,0 @@
|
||||
package com.github.apognu.otter.views |
||||
|
||||
import android.animation.Animator |
||||
import android.animation.ObjectAnimator |
||||
import android.graphics.Rect |
||||
import android.view.View |
||||
import android.view.ViewGroup |
||||
import androidx.transition.TransitionValues |
||||
import androidx.transition.Visibility |
||||
|
||||
class ExplodeReveal : Visibility() { |
||||
private val SCREEN_BOUNDS = "screenBounds" |
||||
|
||||
private val locations = IntArray(2) |
||||
|
||||
override fun captureStartValues(transitionValues: TransitionValues) { |
||||
super.captureStartValues(transitionValues) |
||||
|
||||
capture(transitionValues) |
||||
} |
||||
|
||||
override fun captureEndValues(transitionValues: TransitionValues) { |
||||
super.captureEndValues(transitionValues) |
||||
|
||||
capture(transitionValues) |
||||
} |
||||
|
||||
override fun onAppear(sceneRoot: ViewGroup, view: View, startValues: TransitionValues?, endValues: TransitionValues?): Animator? { |
||||
if (endValues == null) return null |
||||
|
||||
val bounds = endValues.values[SCREEN_BOUNDS] as Rect |
||||
|
||||
val endY = view.translationY |
||||
val distance = calculateDistance(sceneRoot, bounds) |
||||
val startY = endY + distance |
||||
|
||||
return ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, startY, endY) |
||||
} |
||||
|
||||
override fun onDisappear(sceneRoot: ViewGroup, view: View, startValues: TransitionValues?, endValues: TransitionValues?): Animator? { |
||||
if (startValues == null) return null |
||||
|
||||
val bounds = startValues.values[SCREEN_BOUNDS] as Rect |
||||
|
||||
val startY = view.translationY |
||||
val distance = calculateDistance(sceneRoot, bounds) |
||||
val endY = startY + distance |
||||
|
||||
return ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, startY, endY) |
||||
} |
||||
|
||||
private fun capture(transitionValues: TransitionValues) { |
||||
transitionValues.view.also { |
||||
it.getLocationOnScreen(locations) |
||||
|
||||
val left = locations[0] |
||||
val top = locations[1] |
||||
val right = left + it.width |
||||
val bottom = top + it.height |
||||
|
||||
transitionValues.values[SCREEN_BOUNDS] = Rect(left, top, right, bottom) |
||||
} |
||||
} |
||||
|
||||
private fun calculateDistance(sceneRoot: View, viewBounds: Rect): Int { |
||||
sceneRoot.getLocationOnScreen(locations) |
||||
|
||||
val sceneRootY = locations[1] |
||||
|
||||
return when (epicenter) { |
||||
is Rect -> return when { |
||||
viewBounds.top <= (epicenter as Rect).top -> sceneRootY - (epicenter as Rect).top |
||||
else -> sceneRootY + sceneRoot.height - (epicenter as Rect).bottom |
||||
} |
||||
|
||||
else -> -sceneRoot.height |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue