Skip to content

Commit

Permalink
Initial support of fling animation
Browse files Browse the repository at this point in the history
  • Loading branch information
max-kammerer committed May 29, 2024
1 parent 84a1865 commit dea42ae
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 2 deletions.
1 change: 1 addition & 0 deletions orion-viewer/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ dependencies {
implementation "androidx.multidex:multidex:2.0.1"
implementation 'androidx.navigation:navigation-fragment-ktx:2.7.7'
implementation 'androidx.navigation:navigation-ui-ktx:2.7.7'
implementation 'androidx.dynamicanimation:dynamicanimation:1.0.0'

androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation 'androidx.test:core:1.5.0'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package universe.constellation.orion.viewer.selection

import android.graphics.Point
import androidx.core.view.GestureDetectorCompat
import android.view.GestureDetector
import android.view.MotionEvent
import universe.constellation.orion.viewer.*
import android.view.View
import androidx.core.view.GestureDetectorCompat
import androidx.dynamicanimation.animation.FlingAnimation
import androidx.dynamicanimation.animation.FloatPropertyCompat
import universe.constellation.orion.viewer.OrionViewerActivity
import universe.constellation.orion.viewer.log
import universe.constellation.orion.viewer.view.OrionDrawScene

enum class State {
Expand All @@ -16,6 +20,29 @@ enum class State {

open class NewTouchProcessor(val view: OrionDrawScene, val activity: OrionViewerActivity) : GestureDetector.SimpleOnGestureListener() {

val property = object : FloatPropertyCompat<View>("doScroll") {
var prevValue = 0f

override fun getValue(view2: View): Float {
return prevValue
}

override fun setValue(view2: View, value: Float) {
val delta = prevValue - value
view.pageLayoutManager?.doScroll(0f, 0f, 0f, -delta)
prevValue = value
}
}

private val flingAnim =
FlingAnimation(
view,
property
)
.setMinValue(-20000f)
.setFriction(0.5f)
.setMaxValue(20000f)

private val detector = GestureDetectorCompat(activity, this)

protected var state = State.UNDEFINED
Expand All @@ -27,6 +54,8 @@ open class NewTouchProcessor(val view: OrionDrawScene, val activity: OrionViewer
private val start0 = Point()
private val last0 = Point()

private var isFlingActiveOnDown = false

init {
detector.setIsLongpressEnabled(true)
detector.setOnDoubleTapListener(this)
Expand Down Expand Up @@ -74,10 +103,28 @@ open class NewTouchProcessor(val view: OrionDrawScene, val activity: OrionViewer
}

override fun onDown(e: MotionEvent): Boolean {
isFlingActiveOnDown = flingAnim.isRunning
if (isFlingActiveOnDown) {
flingAnim.cancel()
}

log("onDown")
return true
}

override fun onFling(
e1: MotionEvent?,
e2: MotionEvent,
velocityX: Float,
velocityY: Float
): Boolean {
println("onFlingX $velocityY")
flingAnim.cancel()
flingAnim.setStartVelocity(velocityY)
flingAnim.start()
return true
}

override fun onScroll(e1: MotionEvent?, e2: MotionEvent, distanceX: Float, distanceY: Float): Boolean {
println("onScroll $enableTouchMove")
if (!enableTouchMove) {
Expand All @@ -89,6 +136,10 @@ open class NewTouchProcessor(val view: OrionDrawScene, val activity: OrionViewer
}

override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
if (isFlingActiveOnDown) {
return true
}

log("onSingleTapConfirmed")
resetNextState()
doAction(e.x.toInt(), e.y.toInt(), false)
Expand All @@ -103,6 +154,10 @@ open class NewTouchProcessor(val view: OrionDrawScene, val activity: OrionViewer
}

override fun onLongPress(e: MotionEvent) {
if (isFlingActiveOnDown) {
return
}

log("onLongPress $state $nextState")
if (state != State.UNDEFINED) return
doAction(e.x.toInt(), e.y.toInt(), true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import android.graphics.PointF
import android.graphics.drawable.Drawable
import android.util.AttributeSet
import android.view.View
import android.widget.Scroller
import universe.constellation.orion.viewer.log
import universe.constellation.orion.viewer.util.MoveUtil

Expand Down Expand Up @@ -62,6 +63,8 @@ class OrionDrawScene : View {

lateinit var stuff: ColorStuff

val scroller = Scroller(context)

constructor(context: Context) : super(context)

constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
Expand Down

0 comments on commit dea42ae

Please sign in to comment.