1

「NodeGrid」と呼ばれるカスタム ViewGroup の子である「Node」と呼ぶカスタム ビューがあります。「NodeGrid」クラスは、より具体的には RelativeLayout を拡張します。

カスタム ビュー クラス (「ノード」) に次のコード スニペットがあります。

private boolean isBeingDragged = false;

@Override
public boolean onTouchEvent(MotionEvent event) {

    if (event.getAction() == MotionEvent.ACTION_DOWN)
    {
        isBeingDragged = true;
    }
    else if (event.getAction() == MotionEvent.ACTION_UP)
    {
        isBeingDragged = false;
    }
    else if (event.getAction() == MotionEvent.ACTION_MOVE)
    {
        if (isBeingDragged)
        {
            float xPosition = event.getX();
            float yPosition = event.getY();

            //change the x and y position here
        }
    }

    return false;
}

問題:

このコードでブレークポイントを設定した後、onTouchEventはMotionEvent.ACTION_DOWNの場合にのみ呼び出され、他の 2 つのケース (「アクション アップ」または「アクション ムーブ」) では呼び出されないようです。これを引き起こしている可能性のある何かを知っている人はいますか?

また(関連する可能性があります):

ビューが ViewGroup にどのように追加されるかは重要ですか? 「addView」に加えて、「addFocusables」や「addTouchables」など、ViewGroup に子を追加するためのメソッドが他にもあることに気付きました。現在、「addView」を使用して子ビューを ViewGroup に追加しているだけです。

4

1 に答える 1

7

SDK ドキュメントから:

onTouch() - リスナーがこのイベントを消費するかどうかを示すブール値を返します。重要なことは、このイベントには、互いに続く複数のアクションを含めることができるということです。したがって、ダウン アクション イベントを受信したときに false を返す場合は、イベントを消費しておらず、このイベントからの後続のアクションにも関心がないことを示します。したがって、指のジェスチャーや最終的なアップ アクション イベントなど、イベント内の他のアクションに対して呼び出されることはありません。

同じイベントに関連する後続の呼び出しに関心があることを示すために、ACTION_DOWN イベントがトリガーされたときに true を返す必要があります。

HTH

于 2011-11-17T15:04:54.693 に答える