web-dev-qa-db-ja.com

スワイプ/フリングタブ-ScrollViewと組み合わせて変更しますか?

この特定の問題で私が見つけることができる最善の方法(私はギャラリーを使用していませんが): ScrollViewとギャラリーの干渉 -しかし、実際には具体的な答えはありません。そして、私の実装は明らかにギャラリーを使用していません。

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

だから私はフリング/スワイプ/フリック/あなたがそれを呼び出したいものは何でも私のアプリケーションでしばらく前に動作するようになりました。インスピレーションはいくつかの異なる場所から集められました。そのうちのいくつかは、ここStack Overflowの「基本的なジェスチャ検出」( グリッドレイアウトでのフリングジェスチャ検出 )、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を使用していません。フリングが発生した場合は、タブを変更するだけです(終了)。

現在、一部のタブにはScrollViewが含まれています。これらのScrollViewは、その中のすべてのデータを表示できるようにするために、明らかに上下のスクロールに応答します。問題は、これらのScrollViewの「スクロール」機能が私のフリングジェスチャを上書きするように見えることです。 ScrollViewの内側に飛び込むことはできませんが(うまくスクロールできます)、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=

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;
}

以下のより一般的なソースコードは、おそらくそれほど重要ではありません。タブクラス内の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;
    }
}
24
Codemonkey

FlingableTabHostの実装でこの問題が解決したように見えるため、Google I/O2010アプリのソースコードを確認することをお勧めします。

http://iosched.googlecode.com/svn/trunk/src/com/google/Android/apps/iosched/ui/ScheduleActivity.Java

重要なのは、TabHostを拡張し、そのonInterceptTouchEventメソッドをオーバーライドすることだと思います。

18
Jeff Gilfelt

その価値については、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;
}
0
esilver

私が抱えている同様の問題を解決しようとして、私はこのちょっとしたことを見つけました:

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

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

0
Kingsolmn