【问题标题】:Using OnStateChanged listener simultaneously with OnTouchListener同时使用 OnStateChanged 监听器和 OnTouchListener
【发布时间】:2022-01-11 06:12:13
【问题描述】:

我正在实现一个基于this library 的旋钮。 这个 View 带有一个 onStateChanged 监听器,它告诉我旋钮的当前位置。

val knob = findViewById<View>(R.id.knob) as Knob
knob.setOnStateChanged(object: Knob.OnStateChanged{
    override fun onState(state: Int) {
        // do stuff    
    }    
})

除此之外,我想知道用户何时不再按下/按住旋钮(类似于按钮释放)。我尝试使用 onTouch 监听器来实现这一点。

knob.setOnTouchListener(object: View.OnTouchListener{
    override fun onTouch(view: View?, event: MotionEvent?): Boolean {
        // do stuff
    }
})

问题:当我添加第二个 onTouch 侦听器时,由于某种原因无法再保持和旋转视图。我不知道这是这个特定库的问题还是一般的 Android 问题。

关于如何实现想要的功能有什么建议吗?

【问题讨论】:

    标签: android kotlin view listener


    【解决方案1】:

    一个视图只能有一个 OnTouchListener。不幸的是,该库的作者使用 OnTouchListener 实现了它的一些功能,这会阻止用户使用 OnTouchListener。

    您的替代方法是将 Knob 子类化并覆盖 onMotionEvent,如下所示:

    class MyKnob: Knob {
    
        constructor(context: Context): super(context)
    
        constructor(context: Context, attrs: AttributeSet): super(context, attrs)
    
        constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int): super(context, attrs, defStyleAttr)
    
        constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int): super(context, attrs, defStyleAttr, defStyleRes)
    
        override fun onTouchEvent(event: MotionEvent): Boolean {
            val result = super.onTouchEvent(event)
            if (event.action == MotionEvent.ACTION_UP) {
                // User released knob
            }
            return result
        }
    
    }
    

    那么你需要在你的布局中使用这个类而不是原来的 Knob 类。

    【讨论】:

    • 用自定义视图替换现有视图是可行的,但是如何调用被覆盖的函数? if 语句中的代码由于某种原因没有执行。另外,当我通过调用 findViewById() 获得引用时,如何在我的活动中覆盖 onTouchEvent?
    • 附加信息:当我将行 Log.i("Cutom Knob","onTouchEvent() ${event.action}") 放在 onTouchEvent 中时,控制台只会显示事件ID“0”,等于根据developer.android.com/reference/android/view/…做ACTION_DOWN。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2015-12-13
    • 2018-02-08
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    相关资源
    最近更新 更多