24

この特定の問題で私が見つけることができる最高のもの (私はギャラリーを使用していませんが): ScrollView とギャラリーの干渉- ただし、実際には特定の答えは得られません。そして、私の実装では明らかにギャラリーを使用していません。

興味深い部分は次の太字部分にジャンプします

それで、私は Fling/Swipe/Flick/あなたがそれを呼びたいものは何でも、私のアプリケーションで少し前に動作するようにしました。インスピレーションはいくつかの異なる場所から集められました。そのうちのいくつかは、スタック オーバーフロー (グリッド レイアウトでの Fling ジェスチャ検出)、Code Shogun ( http://www.codeshogun.com/blog/2009/04 ) の「基本的なジェスチャ検出」です。 /16/how-to-implement-swipe-action-in-android/ ) と Android の開発 ( http://developingandroid.blogspot.com/2009/09/implementing-swipe-gesture.html ) ですが、私は使用しません。私のアプリケーションのViewFlipper。フリングが発生した場合は、タブを変更するだけです (両端でラップします)。

現在、タブの一部に ScrollViews が含まれています。これらの ScrollViews は、その中のすべてのデータを表示できるようにするために、上下のスクロールに明らかに応答しますが、驚くことではありません。問題は、これらの ScrollViews の「スクロール」機能がフリング ジェスチャを上書きするように見えることです。私はScrollViewの中に飛び込むことはできませんが(スクロールはうまくいきます)、それらの外側(同じタブ、TableRowなどの他のビュー)で問題なく動作します。

http://blog.velir.com/index.php/2010/11/17/android-snapping-horizo​​ntal-scroll / もざっと見てみましたが、これは Horizo​​ntalScrollView を実装する方法を提供しています。ただし、SimpleOnGestureListener を拡張する (および onFling を上書きする) クラスを介してジェスチャを処理します。これは、私が持っているのと同じ実装です (実際には役に立たないと思います)。Google の ScrollView のソース コード: http://google.com/codesearch/p?hl=en#uX1GffpyOZk/core/java/android/widget/ScrollView.java&d=3

Swipe と ScrollView の実装を簡単に連携させる方法はありますか?

ここに問題があると思います。ScrollView.java は、 onTouchEvent というメソッドと、アクティビティ状態の onTouchEvent のドキュメントも使用します。

「タッチスクリーンイベントがその下のビューのいずれによっても処理されなかったときに呼び出されます。これは、ウィンドウの境界の外で発生したタッチイベントを処理するのに最も役立ちます。ここでは、それを受け取るビューはありません。」

したがって、ScrollView はそれを「オーバーライド」します。どうすればよいでしょうか。両方がチェックされていることを確認する方法はありませんか? onTouchEventがScrollViewによって処理されるときにヒットしない私のonTouchEvent:

@Override
/** Used for swipe gestures */
public boolean onTouchEvent(MotionEvent event) {
    if (gestureDetector.onTouchEvent(event))
        return true;
    else
        return false;
}

以下のより一般的なソース コードは、おそらくそれほど重要ではありません。関連付けられたリスナーを持つ Tabs クラス内のgestureDetector:

    // Gestures
    gestureDetector = new GestureDetector(new MyGestureDetector());
    gestureListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (gestureDetector.onTouchEvent(event)) {
                return true;
            }
            return false;
        }
    };

Tabs クラス (TabActivity を拡張する) のネストされたクラスである私のジェスチャ クラス - これは、このテーマで見つかる他のコードと同じです。

/** GestureDetector used to swipe between classes */
class MyGestureDetector extends SimpleOnGestureListener {
    TabHost tabHost = getTabHost(); 

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        try {
            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) {
                // my tab code
                return true;
            } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                // my tab code
                return true;
            }
        } catch (Exception e) {
            Log.e("MyGestureDetector onFling", e.toString());
        }
        return false;
    }
}
4

3 に答える 3

19

Google I/O 2010 アプリのソース コードをご覧になることをお勧めします。FlingableTabHost実装によってこの問題は解決されているようです。

http://iosched.googlecode.com/svn/trunk/src/com/google/android/apps/iosched/ui/ScheduleActivity.java

その鍵は、そのメソッドを拡張TabHostしてオーバーライドすることにあると思います。onInterceptTouchEvent

于 2011-02-28T13:20:02.810 に答える
0

その価値については、onFlingメソッドの信頼性が非常に低いことがわかりました。SimpleGestureDetectorのonScrollメソッドをオーバーライドし、onInterceptTouchEventを次のように定義します。

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    //Call super first because it does some hidden motion event handling
    boolean result = super.onInterceptTouchEvent(ev);
    if (this.mGestureScanner.onTouchEvent(ev)) return true;
    return result;
}
于 2011-10-01T04:29:35.407 に答える
0

私が抱えている同様の問題を解決しようとして、私はこの一口に出くわしました:

eventsInterceptionEnabled: true に設定すると、このプロパティは、ユーザーが実際にジェスチャを描画していることを認識するとすぐに、その子からイベントを盗むようにオーバーレイに指示します。これは、オーバーレイの下にスクロール可能なビューがある場合に便利です。ユーザーがジェスチャを描画するときに、下にある子がスクロールされないようにするためです。

Android Dev siteから、 <android.gesture.GestureOverlayView>レイアウト ファイルのルートでこの属性を使用することについて説明しています。

于 2011-03-17T18:00:34.983 に答える