Glisser/Fling onglet changeant en conjonction avec le ScrollView?

Le meilleur que j'ai pu trouver sur cette question en particulier (bien que je ne pas utiliser une Galerie): Le ScrollView et Galerie d'interférer - ne donne pas vraiment de réponse précise bien que. Et mon application ne pas utiliser une Galerie, évidemment.

Sauter vers le côté gras de la partie pour la partie intéressante

Je me suis donc Jeter/Glisser/Flick/tout ce que vous voulez l'appeler pour fonctionner il ya un moment sur ma demande. L'Inspiration a été recueillie à partir d'un couple de différents endroits, certains d'entre eux étant de base "détection de mouvement", ici sur un Débordement de Pile ( Fling détection de mouvement sur la grille de mise en page ), Code Shogun ( http://www.codeshogun.com/blog/2009/04/16/how-to-implement-swipe-action-in-android/ ) et le Développement d'Android ( http://developingandroid.blogspot.com/2009/09/implementing-swipe-gesture.html ), mais je n'utilise pas un ViewFlipper dans mon application. Lorsqu'une liaison se produit j'ai tout simplement changer l'onglet (emballage autour à la fin).

Maintenant, certains de mes onglets contiennent ScrollViews. Ces ScrollViews évidemment répondre à haut/bas fait défiler dans l'ordre pour vous permettre de visualiser toutes les données à l'intérieur, pas de surprise là.
Le problème, c'est qu'il semblerait que le défilement de la fonction de ces ScrollViews remplacer mon fling geste. Je ne peux pas les jeter à l'intérieur d'un ScrollView (défilement très bien), mais il fonctionne parfaitement en dehors (sur le même onglet, sur d'autres points de vue comme TableRow ou quoi que ce soit).

J'ai eu un coup d'oeil rapide à http://blog.velir.com/index.php/2010/11/17/android-snapping-horizontal-scroll/ trop, ce qui fournit un moyen de mettre en œuvre HorizontalScrollView. Mais il reste encore des poignées de gestes à travers une classe qui étend la classe SimpleOnGestureListener (et écrase onFling), qui est la même mise en œuvre que j'ai (ce qui m'amène à croire qu'il ne sera pas vraiment vous aider).
Le code Source pour le ScrollView de Google: http://google.com/codesearch/p?hl=en#uX1GffpyOZk/core/java/android/widget/ScrollView.java&d=3

Est-il possible d'avoir mon de la mise en œuvre du Balayage et le ScrollView travailler ensemble sans effort?

C'est là que se situe le problème, je suppose. ScrollView.java utilise également une méthode onTouchEvent et de la documentation pour la onTouchEvent pour les états d'Activité:

"Appelée lorsqu'un écran tactile de l'événement a été
ce n'est pas manipulé par les avis en vertu de l'
c'. Ce qui est le plus utile pour traiter
toucher les événements qui se produisent en dehors de
votre fenêtre de limites, où il n'y a pas de
vue de l'obtenir."

De sorte que le ScrollView ne "remplacer" elle - que dois-je faire? Est-il aucun moyen de vérifier si les deux sont-elles vérifiées? Mon onTouchEvent qui n'est pas atteint lors de la onTouchEvent est géré par le ScrollView:

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

Plus générale, le code source ci-dessous, ce n'est probablement pas tout à fait vital. Le gestureDetector à l'intérieur de mes Onglets de la classe avec son associé de l'auditeur:

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

Mon geste de classe qui est une classe imbriquée de mes Onglets de la classe (qui s'étend à TabActivity) - c'est le même que tout autre code que vous trouverez sur ce sujet:

/** 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;
    }
}
  • J'ai eu le même problème que vous avez mentionné ici. J'ai fini jusqu'au remplacement de ma galerie personnalisée de onInterceptTouchEvent(). Il fonctionne mais est très compliqué et le laid. Et la solution finale n'est pas réutilisable pour les diferent ensemble de points de vue. Je pense que la meilleure façon est d'écrire ma propre mise en œuvre de défilement de la vue qui ne tient pas compte des événements de défilement horizontal.
InformationsquelleAutor Klaus | 2011-02-24