5

更新: 何が起こっているのかわかりました。コメントを参照してください。

スケール ジェスチャを受け取るまで、すべてのジェスチャを最初の子に渡す ViewSwitcher を作成しようとしています。次に、最初の子に戻るときに、その子が再び完全にズームアウトされるまで、それらを 2 番目の子に渡します。私のサブクラスには ScaleGestureDetector があり、非常に単純なリスナーを作成しました。

    protected class OnScaleModeSwitcher implements ScaleGestureDetector.OnScaleGestureListener
    {
        protected PageFlipSwitcher owner;

        public OnScaleModeSwitcher(PageFlipSwitcher newOwner)
        {
            super();
            owner = newOwner;
        }

        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            return false;
        }

        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            owner.onScaleBegin();
//returning false here causes the rest of the gesture to be ignored.
            return false;
        }

        @Override
        public void onScaleEnd(ScaleGestureDetector detector) {
            owner.onScaleEnd();
        }
    }

ご覧のとおり、作成時に所有者オブジェクトへの参照を取得し、いくつかのイベントを所有者クラス内のメソッドに渡すだけです。ただし、コードは onScaleEnd() に到達していません。

onInterceptTouchEvent が少し危ないかもしれないことは承知しています。Android docs の提案に可能な限り厳密に従いました。

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev)
    {
        onTouchEvent(ev);
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev)
    {
//mode is the name of the ScaleGestureDetector
        mode.onTouchEvent(ev);

//this code just passes events to the children
//it seems to work OK
        if(zoomActive)
        {
            //ZoomSwitcher
            getChildAt(1).onTouchEvent(ev);
        }
        else
        {
            //Gallery
            getChildAt(0).onTouchEvent(ev);
        }
        return true;
    }

GestureDetector が ACTION_UP イベントを受信しない可能性があることを別の場所で読みました。

Android:スクロールが終了したことを検出する方法

それがここで起こっていることですか?もしそうなら、 onScaleEnd() メソッドのポイントは何ですか?

編集:

私はこれを解決しました。これは、私のメソッドが false を返すためです。Eclipse はいくつかのスタブを自動実装しましたが、それらを入力したときに戻り値を変更しませんでした。

4

1 に答える 1

7

onScaleBegin(...)からfalseを返すScaleGestureDetectorが設定されている場合、後続のメソッドはいずれもヒットしません。通常、MotionEventを消費するがfalseを返すメソッドは、リスナーがリセットされるACTION_UPの後まで後続のMotionEventを取得しません。

于 2011-07-27T12:10:56.953 に答える