Androwish: défilement avec le doigt

 

J'ai transferé une application tcl sur une tablette android en utilisant androwih. Cela fonctionne parfaitement bien, excepté le scroll des fenetres, à l'aide de souris, sans utiliser les barres de défilement. Les boutons <4> et <5> ansi que <MouseWheel> ne génerent pas d'événements. Par contr, j'ai vu sur le site http://www.androwish.org/index.html/wiki?name=sdltk+command, qu'il existe un événement <FingerMotion> dont voici la description

   <<FingerMotion>>
   A touch movement (sliding) event. The fields %x and %y are substituted with the finger position scaled
   to {0...9999} of the device screen or viewport, %X and %Y with the motion difference scaled to {0...9999},
   %t with the pressure scaled to {0...9999}, and %s with the finger identifier {1...10}. These substitutions
   are performed for all finger related touch events.

La variable de déplacement %Y ne semble pas fonctionner et renvoi toujours 0. On détermine donc le déplacement du doigt à partir des variables de position %x et %y. On ne s'interresse ici qu'au déplacement vertical donc en utilisant %y

Voici un exemple de code pour faire défiler un widget 'canvas'

 package require Tk

  canvas .txt -yscrollincrement 1
  # remplissage avec des lignes
  for { set n 0} {$n<60 } {incr n} {
    .txt create text 5 [expr  32*$n] -anchor nw -text "ligne $n"
    }
  pack .txt  -side left -fill both -expand 1
  # region à 'scroller'
  .txt configure -scrollregion "0 0 300 2000"

  variable y0
  set  y0 -1

  bind .txt <Button> {
    set y0 -1
    }

  bind .txt <<FingerMotion>>  {
    global y0
    if { $y0 ==-1} {
       set delta 0
       set y0 %y
       } \
    else {
     set delta [expr  $y0 - %y]
     set y0  %y
      }
    set d [expr $delta/2]
    .txt yview scroll $d units
    }

La variable y0 indique la position précédente du doigt, et est initialisée à -1 Le déplacement vertical est égal à $y0 - %y . Il est divisé par 2 pour ne pas aller trop vite Lorsque on commence un défilement, la variable y0 est réinitialisée à l'aide de l'événement <Button> sinon le déplacement 'delta' aurait une valeur quelquonque au départ selon la position du doigt sur l'écran, et cela entrainerait un saut brutal de l'affichage.