簡體   English   中英

Android在沒有ACTION_DOWN的情況下獲得ACTION_UP

[英]Android getting ACTION_UP without ACTION_DOWN

嗨,我想將觸摸事件傳遞給父對象,僅當觸摸發生移動時,當用戶單擊時,我想在孩子中處理它,因此我在孩子中嘗試了此操作:

private boolean moved = false;
@Override
public boolean onTouchEvent(MotionEvent event)
{
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        super.onTouchEvent(event);
        moved = false;
        return false;
    }
    if (event.getAction() == MotionEvent.ACTION_MOVE) {
        moved = true;
        return false;
    }
    if (event.getAction() == MotionEvent.ACTION_UP) {
        return !moved;
    }
    return true;
}

但是當我在ACTION_DOWN上返回false時,我沒有得到ACTION_UP

在ACTION_DOWN時間發生時,我不知道是否會處理

“如果您從ACTION_DOWN事件返回true,則對該手勢中的其余事件都感興趣。在這種情況下,“手勢”表示所有事件,直到最后的ACTION_UP或ACTION_CANCEL。從ACTION_DOWN返回false表示您不希望事件和其他視圖將有機會進行處理。如果視圖重疊,則可能是同級視圖。否則,氣泡會上升到父視圖。” - 從Android中的事件處理方法返回的布爾值的含義是什么

當您返回false時,您不會消耗觸摸事件,而是將其傳遞給父級事件(並且通過實驗發現,您無法繼續執行該手勢),如果您返回true,則您將負責處理。

所以試試這個

    private boolean moved = false;
    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            // CALL YOUR PARENT onTouch() IF YOU NEED TO
            moved = false;
        }

        else if (event.getAction() == MotionEvent.ACTION_MOVE)
            moved = true;

        else if (event.getAction() == MotionEvent.ACTION_UP)
            return !moved;

        return true;
    }

根據這個官方的Android開發者網站鏈接(閱讀Capturing touch events for a single view部分)

當心創建為ACTION_DOWN事件返回false的偵聽器。 如果執行此操作,將不會為后續的ACTION_MOVEACTION_UP事件字符串調用偵聽器。 這是因為ACTION_DOWN是所有觸摸事件的起點。

暫無
暫無

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

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