7

私はここ数時間頭を悩ませていました.Googleをグーグルで検索しましたが、StackOverflowや他の場所の例はどれもうまくいきませんでした.

私はカスタムビューを持っていextends LinearLayout and implements GestureDetector.OnGestureListenerます.

私のカスタム レイアウトには 3 つのボタンがあり、それぞれにクリック リスナーがあります。私が望むのは、ビュー内のどこでも Fling を実行して何かを実行できるだけでなく、ボタンをクリックできるようにすることです。

私の onFling 関数は、ボタンの 1 つではなくビュー内でフリングする場合にうまく機能します。ボタンの 1 つにカーソルを合わせると、ほとんどの場合、クリックが実行されるか、何も実行されない場合があります。

私のコードの関連部分は次のとおりです。

@Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {
            return false;
        }
        // right to left swipe
        if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
                && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            viewFlipper.setInAnimation(slideLeftIn);
            viewFlipper.setOutAnimation(slideLeftOut);
            viewFlipper.showNext();
            return true;

        } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            viewFlipper.setInAnimation(slideRightIn);
            viewFlipper.setOutAnimation(slideRightOut);
            viewFlipper.showPrevious();
            return true;
        }

        return false;
    }

    @Override
    public boolean onDown(MotionEvent e) {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public void onLongPress(MotionEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
            float distanceY) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (gestureDetector.onTouchEvent(event)) {
            return gestureDetector.onTouchEvent(event);
        }
        return false;
    }

return true の任意の組み合わせを試しました。false を返します。私は考えることができました...助けていただければ幸いです!:)

ありがとう!

4

3 に答える 3

3

これが最終的に私のためにそれを解決したものです...(私の質問からの変更されたコードのみ)。それが最善の解決策であるかどうかはわかりませんが、機能します。

@Override
    public boolean onDown(MotionEvent e) {
        // TODO Auto-generated method stub
        return false;
    }

@Override
    public boolean onTouchEvent(MotionEvent e) {
        return gestureDetector.onTouchEvent(e);
    }

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

これにより、ボタンの上でもフリンジジェスチャが可能になり、ボタンをクリックするだけで済みますが、このビューの背後にボタンがある別のビューがある場合は、クリックが逆方向に渡され、ビューの背後にあるボタンをクリックすることがあります。"android:clickable="true"これに対する解決策は、フロントビューのルートレイアウト(LinearLayout、FrameLayoutなど)に追加することです。

于 2012-06-11T07:53:19.497 に答える
1

あなたが説明している状況に関連するかもしれない答えはここにありますhttps://stackoverflow.com/a/9182176/780700

于 2012-06-10T09:52:17.420 に答える
0

SurfaceViewたぶん、すべてのフリングを処理するもの を使用してオーバーレイを設定できます: http://developer.android.com/reference/android/view/SurfaceView.html

上部に surfaceView を使用すると、ボタンは引き続き機能し、フリングは問題なくボタンを乗り越えることができるはずです。

于 2012-06-07T15:52:56.010 に答える