French Dessiner avec le doigt et connaitre précisément les points touchés

Discussion in 'French Forum' started by Fillmore, Jan 17, 2016.

  1. Fillmore

    Fillmore Member Licensed User

    Bonjour à tous,

    je cherche à faire une application qui permet de tracer une courbe avec le doigt. Pas de problème pour ça avec le panel_touch et le didacticiel "Signature". Cependant, j'ai besoin de savoir précisément quelles zones sont traversées par la courbe. Si je fais un tracé rapide, le relevé des points n'est pas assez précis et certaine zone apparaissent comme non traversée. J'ai bien fait un calcul de tous les points constituant chaque petite droite pour savoir si la courbe traversait la zone, mais ça ne fonctionne pas dans tous les cas.
    Question : peut-on rendre plus précise la fonction Panel_touch pour que le relevé de position se fasse plus souvent ?
    Ou sinon, y a-t-il un moyen de détecter lorsque mon doigt passe sur un objet (label par exemple).
    Si quelqu'un a une idée... Merci bien !

    Bon dimanche à tous.

    Fred
     
  2. klaus

    klaus Expert Licensed User

    J'ai un 'vieux' souvenir que l'évènement Panel_Touch n'est pas très rapide, je ne sais pas si c'est toujours le cas.
    Essaies d'ajouter une routine évènement pour Panel_Touch avec la librairie Reflection.
     
  3. Informatix

    Informatix Expert Licensed User

    Utilise ma bibliothèque GestureDetector. Il y a deux fonctions getHistoricalX et getHistoricalY qui te donneront les points intermédiaires entre deux événements.
     
    lemonisdead likes this.
  4. Fillmore

    Fillmore Member Licensed User

    Merci ! Je vais regarder ça rapidos !
     
  5. Fillmore

    Fillmore Member Licensed User

    Pendant que j'y suis... Est-ce que Gesture detector peut détecter lorsque le doigt je passe sur un objet ? J'ai besoin de connaitre les coordonées traversées pour savoir si l'objet en question est traversé, mais peut-être que l'objet peut réagir directement lorsqu'il est touché, ce serait plus simple.
    Merci encore.

    Fred
     
  6. Informatix

    Informatix Expert Licensed User

    Les évènements de toucher sont envoyés à l'objet qui a reçu le premier évènement (touch down, action = 0). Donc quand tu fais passer ton doigt au dessus d'autres vues, celles-ci ne peuvent recevoir aucun évènement. Il faut vérifier si les coordonnées du toucher sont dans la zone d'affichage d'une vue (c'est ce que fait un panel pour déléguer l'évènement à un de ses enfants).
     
  7. Fillmore

    Fillmore Member Licensed User

    Ok, c'est ce qui me semblait. C'est juste compliqué du coup quand ma vue est animée (en rotation notamment). Concernant la fonction GetHistoricalX, elle renvoie un nombre ou un ensemble de nombre ? Comment je l'appelle ? : If GetHistoricalX > 500 and GetHistoricalX < 600 then blablabla ?
    Merci

    Fred
     
  8. Informatix

    Informatix Expert Licensed User

    Commence par lire la description de la fonction et ses paramètres ;) Tu peux connaître le nombre de points disponibles avec HistorySize.
     
  9. Fillmore

    Fillmore Member Licensed User

    Dac, j'avais pas vu ça. Je vais tatonner, c'est de toute façon le meilleur moyen d'apprendre. Encore merci.

    Fred
     
  10. Fillmore

    Fillmore Member Licensed User

    En fait qq chose m'échappe... Si j'ai 20 points par exemple, où sont-il rangés ? dans gd.GetHistoricalX(0 à 19) ?
    Merci
     
  11. Informatix

    Informatix Expert Licensed User

    C'est le paramètre pos de la fonction.
     
  12. Fillmore

    Fillmore Member Licensed User

    Bon, j'ai fait ça, mais mon label ne change pas de couleur quand je passe dessus. Le PtrIndex, c'est pour le multitouch je pense ? J'ai mis 0, mais c'est peut-être pas bon...
    Un peu perdu sur le coup...

    Désolé...

    Code:
    Sub Gesture_onTouch(Action As Int, X As Float, Y As Float, MotionEvent As Object) As Boolean


    historic=GD.getHistorySize(MotionEvent)

    For t=0 To historic-1
       


    If GD.getHistoricalX(MotionEvent,0,t)>= labelcg.Left And GD.getHistoricalX(MotionEvent,0,t)<= labelcg.Left+labelcg.Width  And GD.getHistoricaly(MotionEvent,0,t)>=labelcg.top And GD.getHistoricaly(MotionEvent,0,t)<=labelcg.Top+labelcg.Height Then

            labelcg.Color=
    Colors.Green
     
        
    End If

    Next

    Return True
    End Sub
     
  13. Informatix

    Informatix Expert Licensed User

    Le code a l'air correct à première vue. As-tu contrôlé les points renvoyés en les loggant ? Il n'y en a peut-être pas assez (du genre un au-dessus et un en dessous de ton label).
     
  14. Informatix

    Informatix Expert Licensed User

    Une autre solution est d'associer un GestureDetector à toutes les vues et de renvoyer False dans l'évènement Touch (la vue rejette l'évènement; celui-ci et les évènements ultérieurs deviennent alors détectables par d'autres vues). Pas testé.
     
  15. Fillmore

    Fillmore Member Licensed User

    En fait, le log ne renvoie rien, j'ai mis une action a faire en tête de routine ('Gesture_ontouch') et elle ne se réalise pas. JE pense que la routine n'est même pas visitée...
     
  16. Fillmore

    Fillmore Member Licensed User

    C'est bon, j'avais un autre fonction qui interceptait le touch avant la tienne. Maintenant ça fonctionne.
    Si je ne veux dessiner que d'un seul doigt, c'est avec "Painters" que ça se passe ? Je n'utilise que le painter(0) ?

    Merci encore et bonne journée.

    Fred
     
  17. Informatix

    Informatix Expert Licensed User

    Ma démo Paint est prévue pour du multitouch. Avec un seul pointeur (0), c'est nettement plus simple.
     
    lemonisdead likes this.
  18. Fillmore

    Fillmore Member Licensed User

    Oui, j'ai regardé. Je devrais y arriver :)
     
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice