9

タイトルで述べたように、アプリには aScrollViewと aGestureDetectorもあります。ScrollView のタッチ イベントの外で、GestureDetector は左から右、右から左などのスワイプ アクションを処理します。それらはすべてうまく機能しています。

GestureLibraryここで、Activity に -I mean raw-を追加したいと思います。私はさまざまなソースを見て、どういうわけか適切に追加しました。簡単に言えば、レイアウトは次のようになります。

<android.gesture.GestureOverlayView
    android:id="@+id/gOverlay"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ScrollView 
        android:id="@+id/content_scroll"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:scrollbars="none">

            </ScrollView>
            <!-- Other views -->
</android.gesture.GestureOverlayView>   

思った通りに描画されていますが (黄色の線)、メソッドがトリガーされていません。ここで私がどのように実装したかOnGesturePerformedListener

    /*
     * Gestures
     */
    gLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures);
    if (!gLibrary.load()) { finish(); }
    GestureOverlayView gestureOverlayView = (GestureOverlayView) findViewById(R.id.gOverlay);
    gestureOverlayView.addOnGesturePerformedListener(gestureListener);  

そしてここにあるgestureListener

private OnGesturePerformedListener gestureListener = new OnGesturePerformedListener() {
    public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
        ArrayList<Prediction> predictions = gLibrary.recognize(gesture);            
        if (predictions.size() > 1) {
            for(Prediction prediction: predictions){
                Log.d("Test", "Looking for gestures");
            }
        }
    }
};

それで全部です。壁のそばで、ScrollView がなく正常に動作する別のアクティビティでこのソース コードを試してみました。

最後に、それが GestureDetector に関するものかどうかわからないので、検出器を使用するアプリは次のようになります。

public boolean dispatchTouchEvent(MotionEvent ev) {
    if (detector != null) {
        if (detector.onTouchEvent(ev)) {
            return true;
        }
    }
    return super.dispatchTouchEvent(ev);
}

そして私のSwipeDetector

private class SwipeDetector extends SimpleOnGestureListener {
    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_MAX_OFF_PATH = 250;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;
    public boolean onFling(android.view.MotionEvent e1, android.view.MotionEvent e2, float velocityX, float velocityY) {
        if( Math.abs( e1.getY() - e2.getY() ) > SWIPE_MAX_OFF_PATH ) { return false; }
        if( e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs( velocityX ) > SWIPE_THRESHOLD_VELOCITY ) { return false; }
        if( e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs( velocityX ) > SWIPE_THRESHOLD_VELOCITY ) {  filterButton.performClick();return true; }          
        return false;
    }
}

私のアプローチの何が問題になっていますか?

4

1 に答える 1

8

Android のすべてのタッチ イベントは、子から親に渡されます。したがって、スクロールビューはすべてのタッチイベントを処理し、ジェスチャー検出器はそれらを受け取りません。タッチリスナーをScrollView次のように設定できます。

    scrollView.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (detector != null) {
                return detector.onTouchEvent(event);
            return false;
        }
    });

スクロールが必要に応じて機能し、スクロール イベントを消費していないことを確認する必要があります。

于 2012-11-19T07:51:16.917 に答える