使用onTouch的自定义视图无法顺利弹出

问题描述 投票:0回答:1

我用手势制作了一个简单的类,并在视图中使用它。

我正在尝试进行简单的滑动以消除效果,但最后,效果并不那么顺利。翻译很好,但是当手指松开时,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
    }
}

你知道这是怎么了吗?

提前感谢!

android gesture ontouchlistener onfling
1个回答
0
投票

我已经实现了向左和向右滑动的手势。请尝试执行此操作。

import android.content.Context
import android.view.GestureDetector
import android.view.GestureDetector.SimpleOnGestureListener
import android.view.MotionEvent
import android.view.View
import android.view.View.OnTouchListener

open class OnSwipeTouchListener(ctx: Context) : OnTouchListener {

val gestureDetector: GestureDetector

companion object {

    private val SWIPE_THRESHOLD = 100
    private val SWIPE_VELOCITY_THRESHOLD = 100
}

init {
    gestureDetector = GestureDetector(ctx, GestureListener())
}

override fun onTouch(v: View, event: MotionEvent): Boolean {


    var isTouch = false

    if (gestureDetector != null && event != null) {

        isTouch = gestureDetector.onTouchEvent(event)
    } else {
        isTouch = true
    }

    return isTouch

}

inner class GestureListener : SimpleOnGestureListener() {

    override fun onDown(e: MotionEvent): Boolean {
        return false
    }

    override fun onFling(e1: MotionEvent?, e2: MotionEvent?, velocityX: Float, velocityY: Float): Boolean {
        var result = false
        try {


            val diffY = e1?.y?.let { e2?.y?.minus(it) }
            val diffX = e1?.x?.let { e2?.x?.minus(it) }

            if (diffX != null && diffY != null) {

                if (Math.abs(diffX) > Math.abs(diffY)) {
                    if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffX > 0) {
                            onSwipeRight()
                        } else {
                            onSwipeLeft()
                        }
                        result = true
                    }
                } else {

                }
            } else {
                onSwipeRight()

                result = true
            }


            /*else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
               if (diffY > 0) {
                   onSwipeBottom()
               } else {
                   onSwipeTop()
               }
               result = true
           }*/
        } catch (exception: Exception) {
            exception.printStackTrace()
        }

        return result
    }


}

open fun onSwipeRight() {}

open fun onSwipeLeft() {}

open fun onSwipeTop() {}

open fun onSwipeBottom() {}

open fun onSwipeDown() {

 }
}

从您的视角拨打电话

     view?.setOnTouchListener(object : OnSwipeTouchListener(it) {

            override fun onTouch(v: View, event: MotionEvent): Boolean {


                return super.onTouch(v, event)
            }


            override fun onSwipeDown() {

                super.onSwipeDown()
            }

            override fun onSwipeRight() {


            }     
            override fun onSwipeLeft() {
                super.onSwipeLeft()


                        }

                    }
                }
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.