Я сделал простой класс с помощью жестов, и я использую его в виде.
Я пытаюсь сделать простое движение, чтобы отклонить эффект, но, в конце концов, это не так гладко. перевод отличный, но когда происходит отпускание пальца, скорость от функции onFling выглядит неправильно ..
class SwipeGestureListener : SimpleOnGestureListener, OnTouchListener {
var context: Context? = null
lateinit var flingDetector: GestureDetector
lateinit var flingY: FlingAnimation
lateinit var springBackTranslationYAnimation: SpringAnimation
var lastY = 0f
val minDistanceUp = 40
val friction = 0.1f
var minFlingArea = 0f
var isItUpDirection = false
constructor(
context: Context?,
dialog: View?
) {
this.context = context
dialog?.let {
it.viewTreeObserver
?.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
minFlingArea = -(it.height + it.top).toFloat() - 100f
it.viewTreeObserver.removeOnGlobalLayoutListener(this)
}
})
}
flingDetector = GestureDetector(context, flingListener)
springBackTranslationYAnimation = SpringAnimation(dialog,
object : FloatPropertyCompat<View>("translationY") {
override fun getValue(view: View): Float {
return view.translationY
}
override fun setValue(
view: View,
value: Float
) {
view.translationY = value
}
})
val springForceY = SpringForce(0f)
springForceY.stiffness = SpringForce.STIFFNESS_VERY_LOW
springForceY.dampingRatio = SpringForce.DAMPING_RATIO_LOW_BOUNCY
springBackTranslationYAnimation.spring = springForceY
springBackTranslationYAnimation.addUpdateListener(dynamicAnimationCallback())
flingY = FlingAnimation(dialog, DynamicAnimation.TRANSLATION_Y)
}
private val flingListener: GestureDetector.OnGestureListener =
object : SimpleOnGestureListener() {
override fun onDown(e: MotionEvent?): Boolean {
return true
}
override fun onFling(
downEvent: MotionEvent,
moveEvent: MotionEvent,
velocityX: Float,
velocityY: Float
): Boolean {
val distanceY = downEvent.rawY - moveEvent.rawY
if (distanceY >= minDistanceUp && isItUpDirection) {
flingY.setStartVelocity(if (velocityY > 0) -(velocityY) else velocityY)
.setMinValue(minFlingArea)
.setFriction(friction)
.start()
} else {
springBackTranslationYAnimation.start()
}
return true
}
}
override fun onTouch(view: View, event: MotionEvent): Boolean {
view.performClick()
when (event.actionMasked) {
MotionEvent.ACTION_DOWN -> {
flingY.cancel()
springBackTranslationYAnimation.cancel()
}
MotionEvent.ACTION_MOVE -> {
val deltaY = event.rawY - lastY
view.translationY = deltaY + view.translationY
isItUpDirection = event.rawY < lastY
}
MotionEvent.ACTION_UP -> {
if (!isItUpDirection) {
springBackTranslationYAnimation.start()
}
}
}
lastY = event.rawY
flingDetector.onTouchEvent(event)
return true
}
}
Есть идеи, что здесь не так?
Заранее спасибо!