簡體   English   中英

快速/正常單擊 OnTouchListener.onTouch 不會觸發 ACTION_UP

[英]ACTION_UP is not triggered for a quick/normal click on OnTouchListener.onTouch

我有一個按鈕來觸發 MainActivity 中的某些操作,我想繪制 animation 如下:當用戶按住按鈕(ACTION_DOWN)時它會縮小,當按鈕釋放(ACTION_UP 或 ACTION_CANCEL)時它會放大並且 go 恢復正常state。

當用戶按住按鈕一段時間時,這很有效,但對於正常點擊,即使 ACTION_DOWN 調用 ACTION_UP 也不會被調用。

我在文檔中搜索並檢查了 stackoverflow 上的幾乎所有答案,但沒有發現任何有用的東西。

文檔是這樣說的:“雖然框架試圖向視圖傳遞一致的運動事件流,但它不能保證這一點。某些事件可能會在傳遞之前通過在應用程序中包含視圖而被刪除或修改,從而使事件的 stream 不一致. 視圖應始終准備好處理 ACTION_CANCEL 並應容忍異常情況,例如在沒有首先收到先前手勢的 ACTION_UP 的情況下收到新的 ACTION_DOWN。”

這是我的代碼:

button.setOnTouchListener { view, event ->
            when(event?.action){
                //behaves as expected
                MotionEvent.ACTION_DOWN -> {
                    scaleDown(view)
                }
                //the problem here: ACTION_UP gets called only when user holds the button for some time
                //and not for a quick/ normal click.
                MotionEvent.ACTION_UP -> {
                    scaleUp(view)
                    doSomething()
                }
                //behaves as expected
                MotionEvent.ACTION_CANCEL -> {
                    scaleUp(view)
                }
            }
            true
        }

我有兩個問題,首先:為什么 ACTION_UP 永遠不會被調用來進行快速/正常點擊?

第二:如果我想以兩種不同的方式做出反應,如何區分正常點擊和用戶按住按鈕一段時間?

問題#1

我嘗試了下面的代碼片段,它按預期工作,長時間、正常和快速點擊

button.setOnTouchListener { view, event ->

    if (event.action == MotionEvent.ACTION_DOWN) {
        Log.d("TESTOOO", "DOWN")
    } else if (event.action == MotionEvent.ACTION_UP) {
        Log.d("TESTOOO", "UP")
    }

    true
}

在此處輸入圖像描述

問題2

你能試試setOnLongClickListener()嗎,我試過了,效果很好

在此處輸入圖像描述

回答我自己的問題:

對於第一個問題,問題在於 animation 而不是 OnTouchListener。

對於第二個問題,為了區分正常點擊和長時間點擊,我必須計算在觸發 ACTION_UP 或 ACTION_CANCEL 時觸發 ACTION_DOWN 已經過去了多少毫秒。

如果兩個事件之間的差異小於 300 毫秒,則視為正常點擊,否則為長點擊。

button.setOnTouchListener { view, event ->
    val now = System.currentTimeMillis()
    when(event?.action){
        MotionEvent.ACTION_DOWN -> {
            scaleDown(view)
        }
        MotionEvent.ACTION_UP -> {
             scaleUp(view)
             if(now - event.downTime < 300){
                 //normal click
             }else{
                 //long click
             }
        }
        MotionEvent.ACTION_CANCEL -> 
             scaleUp(view)
        }
   }
   true
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM