この特定の問題で私が見つけることができる最高のもの (私はギャラリーを使用していませんが): 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-horizontal-scroll / もざっと見てみましたが、これは HorizontalScrollView を実装する方法を提供しています。ただし、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;
}
}