Mise à jour: voir Bounty pour une question étendue. strong> J'ai un Voici ma configuration: p> 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>
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
}
}
5 Réponses :
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; }
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 code> listview code> 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 code> ne répond pas. (comme décrit ci-dessus)
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);
Eh bien, je log.d code>
gestuelistener code>, et je ne crois pas que ce n'était jamais nul. J'ai eu mon
listview code> dans la position où mon
Onfling code> 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 code> pour voir lorsque le
événement code> et
Onfling code> était appelé. Plusieurs fois, ils étaient tous deux appelés même lorsque je faisais glisser et que le fragment
code> 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.
Essayez ceci, et apportez les modifications suivantes 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.
}
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 * / code> - mon état nécessite des attributs spécifiques
Onfling () CODE> Attributs tels que deux
motionEvent code> valeurs (code> pas un) et
vélocité code>. 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.
Essayez de faire alors - vous retournez toujours Ontouchlistener Code> comme ceci:
false code> dans
ourdling ( ) code>. Retour
true code> dans
essayer / attraper la clause code>. Et essayez de transmettre les mêmes données à la méthode code> olfroll code> dans la clause d'évaluation de
Overfling code>. P> p>
J'ai toujours eu une certaine confusion à ce sujet; Qu'est-ce que le retour faux code> fait par opposition à
vrai code>? Modification également le premier
FALSE code> in
Onfling () CODE> (sur
true code>) affecte essentiellement le défilement normal
listview code>. 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.
premier fort> Je note que dans votre écouteur de geste, vous retournerez 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 AS une mise à part, le code pour 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> ceci peut être atteint comme Suit: P> 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>
listview code>? Si vous devez les avoir, au moins retourner
false code>, qui est la valeur par défaut (voir ici ). P>
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>
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
}
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é.
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.