French AHViewPager (comment bloquer le scrolling latéral)

john mad doe

Member
Licensed User
Longtime User
Bonjour,

J'utilise AHViewPager et je cherche un moyen pour interdire le déplacement latéral pour changer de page et ainsi obliger l'utilisateur à passer par les boutons en haut de la page.

Pourquoi ce besoin: parce que lorsqu'un bouton est enfoncé, si jamais l'utilisateur effectue à ce moment là un léger mouvement latéral non souhaité, on ne récupere pas l'information que le bouton a été relaché. Or j'ai besoin de savoir que le bouton a été relaché pour terminer l'action démarrée lorsque le bouton a été enfoncé.

John
 

john mad doe

Member
Licensed User
Longtime User
Et bien d'une part parce que mon application est déja écrite en grande partie , je viens de m'apercevoir tardivement de cet effet insésirable.

Et d'autre part parce que suis reparti de l'exemple donné avec la librairie AHViewPager et le fait de pouvoir générer un nombre variable et illimité de pages correspondait tout à fait à ce que je voulais faire.


Il y a aussi le fait qu'avec TabHost , si il y a beaucoup de pages, le nom des onglets risque de devenir illisible .


C'est pourquoi, avant de devoir réécrire une partie de mon appli , je me renseigne pour savoir si il y a une possibilté de désactiver ce déplacement latéral.



Edit: pensez-vous que votre librairie Gesture Detector pourrait m'aider ?
 
Last edited:

Informatix

Expert
Licensed User
Longtime User
Dans ce cas, ce code devrait t'être utile pour bloquer les interceptions d'évènements Touch par le ViewPager:
http://www.b4x.com/android/forum/th...delay-touch-event-to-panel.21845/#post-126782
Mais bon, il va falloir coller ce code dans l'événement Touch de toutes les vues et ça ne va pas empêcher ton mouvement d'être pris en compte dans les zones du ViewPager où il n'y a pas de vue. Es-tu vraiment sûr de vouloir créer une usine à gaz?
Une autre solution est d'envoyer continuellement un événement Cancel à l'AHViewPager avec ma bibliothèque GestureDetector dans sa version payante.
 

john mad doe

Member
Licensed User
Longtime User
Ce que je veux empecher c'est les mouvements lateraux l'orsque l'utilisateur est en train de maintenir un bouton enfoncé, car dans ce cas je ne reçois pas l'information quand le bouton a été relaché. Un scrolling lors d'autres occasion ne me gene pas au contraire.

Je ne veux pas annuler les autres evenement sur le bouton car j'ai besoin d'analyser les suivants: up , down , click et longclick .
En effet j'ai besoin de différencier un appui simple , le début d'un appui long et la fin d'un appui long.

Tu parles bien de ce code ci ?

Dim r AsReflector
r.Target = your_listview
r.RunMethod2("requestDisallowInterceptTouchEvent", True, "java.lang.boolean")



Comme je ne souhaite pas me lancer dans une usine à gaz, je vais étudier la piste que tu proposes et regarder ce que la librairie gesture detector propose . Peut-etre qu'elle saurait capter à la fois le déplacement et le relachement d'un bouton d'une page AHViewPager , et dans ce cas je n'aurais plus besoin de vouloir interdire les deplacements.
 

Informatix

Expert
Licensed User
Longtime User
Ce que je veux empecher c'est les mouvements lateraux l'orsque l'utilisateur est en train de maintenir un bouton enfoncé, car dans ce cas je ne reçois pas l'information quand le bouton a été relaché. Un scrolling lors d'autres occasion ne me gene pas au contraire.

Ah parfait. Dans ce cas, la solution que je t'ai proposée avec requestDisallowInterceptTouchEvent est tout à fait adaptée. Colle le code dans le Touch event de ton bouton et c'est tout bon.
 

john mad doe

Member
Licensed User
Longtime User
Ah super , je garde l'espoir d'arriver à mes fins !

Par contre je n'ai pas compris où je dois coller le code car je n'ai pas d'evenement touch à priori.

voici les subroutines qui répondent à une action sur les boutons :
Sub btnevent_Down , btnevent_Up , btnevent_click , btnEvent_LongClick
et celles qui ne réagissent pas : btnevent_touch et btnevent_Move

j'ai aussi essayé ceci mais sans succes

B4X:
Sub onTouch(Action As Int, X As Float, Y As Float, MotionEvent As Object)
Log("onTouch")
Dim r As Reflector
'r.Target = your_listview
r.Target = pager

r.RunMethod2("requestDisallowInterceptTouchEvent", True, "java.lang.boolean")

End Sub

En clair je suis un peu perdu sur ce qu'il faut faire, se serait super si tu pouvais m'en dire un peu plus pour me débloquer.
Si besoin je peux preparer une application simplifiée basée sur AHViewer avec des boutons.
 

Informatix

Expert
Licensed User
Longtime User
En fait le problème vient des évènements de B4A. Je suis tellement habitué à ne pas les utiliser que j'oublie ce petit détail. Il faut que tu utilises ma bibliothèque Gesture Detector (la version gratuite suffira). Dans l'évènement Touch de GD, tu colles le code comme dans l'exemple et tu retournes False pour éviter de consommer l'évènement.
 

john mad doe

Member
Licensed User
Longtime User
merci de ton aide.
j'ai installé la librairy GD et je l'ai bien selectionnée mais je ne passe dans aucune routine ontouch ? voici mon code


B4X:
Sub onTouch(Action As Int, X As Float, Y As Float, MotionEvent As Object)

Log("onTouch")
Dim r As Reflector
r.Target = pager
r.RunMethod2("requestDisallowInterceptTouchEvent", True, "java.lang.boolean")
End Sub

Sub GD_onTouch(Action As Int, X As Float, Y As Float, MotionEvent As Object)

Log("GD_onTouch")
Dim r As Reflector
r.Target = pager
r.RunMethod2("requestDisallowInterceptTouchEvent", False, "java.lang.boolean")
End Sub

Sub Gesture_onTouch(Action As Int, X As Float, Y As Float, MotionEvent As Object) As Boolean
    Log("Gesture_onTouch action=" & Action & ", x=" & X & ", y=" & Y & ", ev=" & MotionEvent)
    'Return False 'True = Handle this touch event, False = Ignore it
   
Dim r As Reflector
r.Target = pager  'your_listview
r.RunMethod2("requestDisallowInterceptTouchEvent", False, "java.lang.boolean")
End Sub
 

john mad doe

Member
Licensed User
Longtime User
non , en fait je n'avais pas regardé l'exemple fourni.
Je teste ça rapidement . Le fait qu'il y ait 3 routines identiques correspond à differents essais que j'ai fait.
je te tiens au courant.
 

john mad doe

Member
Licensed User
Longtime User
bon ca progresse

j'ai appelé SetOnGestureListener , pour le moment avec le pager en parametre et je passe bien dans la routine Gesture_onTouch.

Je vais ensuite essayer en passant un bouton en parametre.

B4X:
    GD.SetOnGestureListener(pager, "Gesture")


B4X:
Sub Gesture_onTouch(Action As Int, X As Float, Y As Float, MotionEvent As Object) As Boolean
    Log("Gesture_onTouch action=" & Action & ", x=" & X & ", y=" & Y & ", ev=" & MotionEvent)
   
   
    Dim r As Reflector
    r.Target = pager  'your_listview

    r.RunMethod2("requestDisallowInterceptTouchEvent", False, "java.lang.boolean")
   
    Return False 'True = Handle this touch event, False = Ignore it
   
End Sub


quand je fais un appui long avec mouvement sur un bouton j'ai les evenement suivants

C'est encourageant car je recupere l'information ACTION_UP

btnevent_Down
btnevent_Up
Gesture_onTouch action=2, x=1494.0008544921875, y=543.656494140625, ev=MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=1494.0009, y[0]=543.6565, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=5, eventTime=9040319, downTime=9040103, deviceId=1, source=0x1002 }
...
Gesture_onTouch action=1, x=1287.1893310546875, y=546.4761962890625, ev=MotionEvent { action=ACTION_UP, id[0]=0, x[0]=1287.1893, y[0]=546.4762, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=9040686, downTime=9040103, deviceId=1, source=0x1002 }


Je vais maintenent essayer en passant un bouton en parametre.
 

john mad doe

Member
Licensed User
Longtime User
Hourra, Avec les boutons je recupere action_cancel lorsque le bouton est déplacé. Je vais pouvoir utiliser cette information pour arriver à mes fins.

Est-ce qu'il est possible de récupérer le nom du bouton avec sender ? j'ai l'impression que ça ne fonctionne pas car quelque soit le bouton appuyé , je recupere le nom du dernier bouton créé.

Peut-etre dans la version 2 de la bibliotheque ?
 

john mad doe

Member
Licensed User
Longtime User
ah ok. Effectivement ça fonctionne bien maintenant.

Je vais adapter mon code pour gérer le fait que maintenant j'ai l'information que les boutons ont été annulés par un déplacement , et selon que le deplacement aura conduit à un changement de page ou non j'agirai en conséquence.


Je te remercie du temps passé à m'aider , c'est tres sympa.


Edit: finalement c'est bien plus simple que ce que je voulais faire au départ, plus besoin de bloquer le scrolling puisque grace à la bibliotheque GD j'ai acces à l'info qui me manquait.
 
Last edited:
Top