11
votes

Gestes Auditeur Overfling Pas d'acteur constant

Mise à jour: voir Bounty pour une question étendue. strong>

J'ai un GESTURETector code> Configuration sur un ListView code>. La liste de liste est un fragment entier qui vient du côté de la fenêtre et superpose un autre fragment partiellement. Je souhaite donner la capacité de l'utilisateur à balayer sa fermeture (c'est-à-dire que la Wunderlist est un excellent exemple de cette fonction sur le côté droit). P>

Voici ma configuration: p>

public class GestureListener extends SimpleOnGestureListener {

        private static final int SWIPE_MIN_DISTANCE = 180;
        private static final int SWIPE_THRESHOLD_VELOCITY = 50;

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                float velocityY) {

            try {
                if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {

                    FragmentManager fma = getActivity()
                            .getSupportFragmentManager();



                    FragmentManager fm = getFragmentManager();
                    FragmentTransaction t = fm.beginTransaction();

                    SherlockListFragment mFrag = new RateReviewFragment();

                    t.add(R.id.main_frag, mFrag);
                    t.setCustomAnimations(R.anim.animation_enter,
                            R.anim.animation_leave);
                    t.remove(mFrag);
                    t.commit();

                }
                return false;
            } catch (Exception e) {

            }
            return false;
        }





        @Override
        public void onLongPress(MotionEvent e) {

            // edited out; this opens up a context menu
        }

    }


2 commentaires

Si vous recherchez la nouvelle application Gmail, un type de tiroir glissant de la gauche, vous voudrez peut-être jeter un coup d'œil à cela - développeur.android.com/training/imployant-navigation/...


@Varun Ce n'est pas ce genre de curseur pour la navigation. En fait, je l'ai déjà aussi sur le côté gauche .. Cet un côté droit apparaît pour montrer du contenu.


5 Réponses :


2
votes

Changer l'ONTOUCH de cette façon:

@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
     boolean consumed = gestureDetector.onTouchEvent(event);
     if (event.getAction() == MotionEvent.ACTION_MOVE) {
                return false;
     }

    return consumed;
}


6 commentaires

Merci. Testez-vous ... Question: Je n'ai pas pensé qu'Éventouch faisait partie de ces méthodes de SimpleGestture?


toujours le gesturétector transmet des événements tactiles


Cela semble avoir un effet opposé. Il tue toute la capacité de balayage de balayage; Pourtant, tous les trois problèmes ci-dessus restent un problème.


Vous êtes donc capable de faire défiler la liste de liste, mais le fling n'est pas tiré?


Désolé, Fling est de retour, mais le rouleau a les mêmes problèmes ... (comme le fling) J'apprécie votre aide et j'ai hâte de donner ces points. C'est le problème de la mienne dans cette application, je travaille sur.


Eh bien, j'ai fixé une partie des problèmes, où maintenant tous les gestes listview travaillent en fait; Le problème restant est le suivant: dans certains cas (surtout lorsque l'utilisateur fait défiler la lecture lente des rangées, peut-être "Démarrer et arrêter" le défilement, peut-être remonter puis descendant) Le Onfling ne répond pas. (comme décrit ci-dessus)



1
votes

Ne savez pas vraiment si cela aidera comme Dieu sait que ce qui se passe derrière la scène avec tous ces problèmes de fragments, mais essayez ceci:

Après AOUTOTOUCH STRUT> a été appelé, avant de retourner faux chèque Si gestechnector strong> est toujours en vie (non null), (en envoyant un rappel ou quelque chose à la classe ListView) Si ce n'est pas la création d'une nouvelle instance et appelez à nouveau sur P>

listView.setOnTouchListener(gestureListener); 


2 commentaires

Eh bien, je log.d gestuelistener , et je ne crois pas que ce n'était jamais nul. J'ai eu mon listview dans la position où mon Onfling ne fonctionnerait pas, et l'auditeur a toujours enregistré quelque chose ... Si c'était NULL, il semblait que le journal le montrerait?


A fait de mon mieux pour essayer d'utiliser le système de débogage lent et difficile à dire si c'était NULL ... j'ai fait log.d pour voir lorsque le événement et Onfling était appelé. Plusieurs fois, ils étaient tous deux appelés même lorsque je faisais glisser et que le fragment ne réagissait pas au fling. Cela indique presque que mon code de folition est faux? Mais je crois que toutes les balayeurs répondent aux critères de longueur et de vitesse.



3
votes

Essayez ceci, xxx pré>

et apportez les modifications suivantes p> xxx pré>

EDIT: strong> J'ai vu l'application wunderlist, si vous souhaitez simuler cette fonctionnalité, essayez cette approche, P>

Utilisez OninterceptTouch pour la disposition racine (dont la liste de réception est un enfant de), à ​​l'intérieur de cette méthode, vous devez vérifier que vous devez vérifier que L'utilisateur a glissé ou pas comme les suivants, P>

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
  if (ev.getAction() == MotionEvent.ACTION_MOVE) {
    if(/* Check your condition here */) { 
      // User has swiped 
      return true;
    }
  }

  return false; // return false so that the event will be passed to child views.
}


6 commentaires

hé merci pour la suggestion; Malheureusement, je perds toujours la capacité de glisser la fenêtre fermée.


Dans mon expérience travaillant avec Android, vous ne pouvez pas vous attendre à ce que l'appareil fournisse toujours le droit («attendu» serait un mot meilleur) Points touch pour l'interaction de l'utilisateur. Il appartient à nous (les développeurs) de gérer ces cas, alors pourquoi ne pas jouer autour de la situation si vous avez à l'intérieur de l'ONFLING () pour sélectionner le meilleur où il fonctionnerait 8/10 fois. J'espère que ça aide


Je suis d'accord. Si vous voyez ma question mise à jour, j'ai trouvé une énorme incohérence. Bien que je sache, il y a un moyen de faire cela, car Wunderlist l'exécute parfaitement.


J'apprends plus comme lu à ce sujet; Dans votre réponse ci-dessus, vous avez / * vérifier votre condition ici * / - mon état nécessite des attributs spécifiques Onfling () Attributs tels que deux motionEvent valeurs (code> pas un) et vélocité . Comment voudrais-je vérifier mon état ici?


Il y a de nombreuses façons de faire cela, on a souligné que ce soit @Neil comme «troisièmement» dans sa réponse, mais je suggérerais d'aller à ce sujet avec l'aide de Velocity Tracker ( développeur.android.com/reference/andrroid/view/... ).


Merci pour ton aide! Vous avez eu des informations dont j'ai besoin, maintenant je dois simplement la mettre en œuvre! Marquage correct.



0
votes

Essayez de faire Ontouchlistener comme ceci: xxx

alors - vous retournez toujours false dans ourdling ( ) . Retour true dans essayer / attraper la clause . Et essayez de transmettre les mêmes données à la méthode olfroll dans la clause d'évaluation de Overfling .


2 commentaires

J'ai toujours eu une certaine confusion à ce sujet; Qu'est-ce que le retour faux fait par opposition à vrai ? Modification également le premier FALSE in Onfling () (sur true ) affecte essentiellement le défilement normal listview . Cela vous permettra de faire défiler la liste, mais cela ne bougera que lorsque votre doigt touche ...


Vous devez détecter dans ONFLINGER le fling horizontal et faire le défilement de la liste par vous-même, je pense. À propos du vrai / faux: pendant que je faisais comme la documentation indique que mon gesturelistener ne fonctionnait pas (je l'ai écrit pas aussi loin). Donc, je viens de vous conseiller de faire ce que j'ai fait.



1
votes

premier fort>

Je note que dans votre écouteur de geste, vous retournerez true code> dans ONTODOW code>. Si j'ai bien compris votre question, vous quittez correctement les événements du robinet et de la balayage vertical pour le ListView CODE>, et vous n'êtes donc intéressé que par les événements horizontal Swipe dans votre code. P>

Pourquoi pas Supprimez toutes les fonctions que vous n'êtes pas intéressé, laissant ainsi tout ce que vous n'êtes pas intéressé par le listview code>? Si vous devez les avoir, au moins retourner false code>, qui est la valeur par défaut (voir ici ). P>

AS une mise à part, le code pour abslisview code> (le parent de listview code> ) Affiche un système d'état assez complexe pour la manipulation des robinets et des balayements, il est donc probablement préférable que possible aussi non plus que possible à mon avis p>

secondaire p>

donné votre plus Observations récentes, peut-être que la clé est d'envisager le rapport entre les déplacements X et Y plutôt que la taille absolue de glisser. Bien que je ne puisse pas expliquer le changement de taille de balayage signalé, ce que nous sommes vraiment intéressés est un mouvement qui est principalement horizontal, c'est-à-dire: p> xxx pré>

ceci peut être atteint comme Suit: P>

int numPointers = e1.getPointerCount();
for (int pointerIndex1 = 0; pointerIndex1 < numPointers; pointerIndex1++) {
    int pointerId = e1.getPointerId(pointerIndex1);
    // find index for pointerId in e2.

    float deltaX = e2.getX(pointerIndex2) - e1.getX(pointerIndex1);
    // and so on
}


2 commentaires

J'ai trouvé quelque chose après avoir enregistré mes actions; Le plus bas que je regarde dans la liste (et plus j'interagis avec elle), les mesures ne sont pas cohérentes. Par exemple, si je déplace mon doigt un centimètre à gauche et à droite - à très top de la liste, il dira que je déménage, par exemple, 200 pixels. Mais quand j'ai le problème ci-dessus, il est bien inférieur, peut-être 50, pour la même distance de 1 centimètre. Donc, la fenêtre ne ferme pas parce que cela ne répond pas à mes conditions de si.


Hey j'apprécie les commentaires à nouveau. Je vais voir ce que je découvre et que tu te tiens posté.