试图设置一个抽象的监听器

Trying to set an Listener which is abstracted

我现在正在开发一个小应用程序来测试周围的运动和触摸事件。我面临的问题是我的 Listener class 必须被抽象化,但我无法从该 listener 创建一个对象,我需要将它放在 imageView 的 "setOnTouchListener" 方法上。

听众class:

abstract class GestureListener(directionDisplayer: TextView) : View.OnTouchListener,` GestureDetector.OnGestureListener {

    private var directionDisplayer: TextView = directionDisplayer

    override fun onTouch(v: View?, event: MotionEvent?): Boolean {
        val gestureDetector = GestureDetector(this)
        gestureDetector.onTouchEvent(event)
        return true
    }

    override fun onFling(
        downEvent: MotionEvent?,
        moveEvent: MotionEvent?,
        velocityX: Float,
        velocityY: Float
    ): Boolean {
        var result = false

        if (downEvent != null && moveEvent != null) {
            var diffY: Float = moveEvent.y - downEvent.y
            var diffX: Float = moveEvent.x - downEvent.x

            val SWIPE_MIN = 100
            val SWIPE_Velocity = 100 //TODO WIDTH

            if (Math.abs(diffX) > Math.abs(diffY)) {
                //RIGHT OR LEFT
                if (Math.abs(diffX) > SWIPE_MIN && Math.abs(velocityX) > SWIPE_Velocity) {
                    if (diffX > 0) {
                        swipeRight()
                    } else {
                        swipeLeft()
                    }
                    result = true
                }
            } else {
                //UP OR DOWN
                if(Math.abs(diffY) > SWIPE_MIN && Math.abs(velocityY) > SWIPE_Velocity) {
                    if(diffY > 0) {
                        swipeUp()
                    } else {
                        swipeDown()
                    }
                    result = true
                }


            }

        }
        return result
    }

    private fun swipeDown() {
        directionDisplayer.text = "Direction: DOWN"
    }

    private fun swipeUp() {
        directionDisplayer.text = "Direction: UP"
    }

    private fun swipeLeft() {
        directionDisplayer.text = "Direction: LEFT"
    }

    private fun swipeRight() {
        directionDisplayer.text = "Direction: RIGHT"
    }

MainActivity (only the important):

    class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        requestWindowFeature(Window.FEATURE_NO_TITLE)
        window.setFlags(
            WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN
        )

        setContentView(R.layout.activity_main)
        val canvasImage: ImageView = findViewById(R.id.canvas)

        canvasImage.setOnTouchListener(GestureListener(findViewById(R.id.showDirection)))

有人知道如何解决这个问题吗?

GestureListener 是一个摘要 class。因此,您必须实现 iew.OnTouchListenerGestureDetector.OnGestureListener 的成员,这些成员尚未在摘要 class 本身或您的代码中实现,例如 -

    canvasImage.setOnTouchListener(object : GestureListener(textView) {
        override fun onShowPress(e: MotionEvent?) {
            TODO("not implemented")
        }

        override fun onSingleTapUp(e: MotionEvent?): Boolean {
            TODO("not implemented")
        }

        override fun onDown(e: MotionEvent?): Boolean {
            TODO("not implemented")
        }

        override fun onScroll(
            e1: MotionEvent?,
            e2: MotionEvent?,
            distanceX: Float,
            distanceY: Float
        ): Boolean {
            TODO("not implemented")
        }

        override fun onLongPress(e: MotionEvent?) {
            TODO("not implemented")
        }
    })