5

複数の子を持つViewGroupがあるとします。このViewGroupについては、すべての子のすべてのMotionEventを管理する必要があります。つまり、VGは
1.ターゲット(子)にディスパッチされる前にすべてのイベントをインターセプトできるようになります。2。VG
は最初にイベントを消費します。さらに、イベントをターゲットの子
3にディスパッチするかどうかを決定します。DOWN、MOVE、UP、比較的独立しているように見せたいので、VGはDOWNを食べることができますが、子供にはMOVEとUPを与えます。

SDKガイド「HandlingUIEvent」を読み、イベントリスナー、ハンドラー、ViewGroup.onInterceptTouchEvent(MotionEvent)、およびView.onTouchEvent(MotionEvent)を知っていました。

これが私のサンプルです、

@Override
public boolean onInterceptTouchEvent (MotionEvent event) {
    if (MotionEvent.ACTION_DOWN == event.getAction()) {
        return true;
    }

    return super.onInterceptTouchEvent(event);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (MotionEvent.ACTION_DOWN == event.getAction()) {            
        return true;
    }
    else {
        if (!consumeEvent(event)) {
            // TODO: dispatch to target since I didn't want to eat event
            //return this.dispatchTouchEvent(event);     // infinite loop!!!
        }
    }


    return super.onTouchEvent(event);
}

SDKがそう言ったので、いくつかのイベントを食べることができるようにするには、DOWNイベントが発生したときに上記の両方のメソッドでtrueを返す必要があります。次に、onTouchEventでMOVEとupを確認できました。しかし、私の場合、子供たちにイベントを送る方法がわかりません。

上記のdispatchTouchEventは、VG自体がターゲットである可能性があるため、理解できる無限ループにつながりました。その時点でどちらがターゲットになるかはわかりません。MotionEventはヒントを提供しなかったため、dispatchTouchEventはまったく役に立ちませんでした。
誰かが私を助けてくれますか?ありがとう。

4

1 に答える 1

4

Viewからソースを見つける簡単な方法onInterceptTouchEventも、これらのイベントを「ディスパッチ」する方法もありません。をディスパッチできますが、をディスパッチすることはできKeyEventませんMotionEvent

sを処理する一般的な方法MotionEvent(ドラッグアンドドロップなど)はMotionEvent.ACTION_DOWN、異なるViews(onTouch実装後のコールバックを介してOnTouchListener)によってMotionEvent.ACTION_MOVEイベントを処理し、親ViewgrouponInterceptTouchEventメソッドを介してイベントを処理することです。


しかし、一部のLOCは、たくさんの言葉以上のものを言っています。私がここで言っていることの非常に良い例があります:http://doandroids.com/blogs/tag/codeexample/


ビュー自体でACTION_DOWNイベントを処理する場合は、どのビューがそれを開始したかを他の場所に保存し、その変数を以降のアクションに使用できます。イベントは、ACTION_UPまたはACTION_CANCELアクションによって終了するまで、同じビューにバインドされます。

ビューを追跡し、ACTION_DOWN中にビューグループでアクションを実行する必要がある場合は、ビューグループにパブリックメソッドを追加することをお勧めします(たとえばpublic boolean handleActionDown (View v, MotionEvent e)、onTouchコールバックから呼び出されます)

于 2011-05-09T03:13:59.767 に答える