Problem mit mobile Scroller

Startseite Foren Deutsches LiveCode-Forum Problem mit mobile Scroller

  • Dieses Thema hat 8 Antworten und 2 Teilnehmer, und wurde zuletzt aktualisiert vor 4 Jahre von wfr.
Ansicht von 8 Antwort-Themen
  • Autor
    Beiträge
    • #8471
      wfr
      Teilnehmer

      Hallo,
      Mich nervt ein Problem mit dem mobile Scroller (Android).
      Ich habe einen Stack (stack1) und 2 Substacks (stack2 und stack3).
      Vom Stack1 springe ich mittels Button jeweils auf stack2 (mit der card „b1“) bzw. auf den stack3 (mit der card „c1“).
      Auf der card b1 und auf der card c1 ist jeweils ein Textfeld mit einem mobilen Scroller, die prinzipiell auch funktionieren. Springe ich zB. auf card b1, kann ich scrollen, gehe ich zurück auf stack1 und springe dann auf die card c1, funktioniert der Scroller dort nicht.
      Beende ich das Programm, und mache es umgekehrt, also ich gehe zuerst auf card c1, funktioniert der Scroller, aber dann geht der auf card b1 nicht.

      on preOpenCard
         global sScrollerID
         global tScrollerRect, tContentRect, vOffset
         BewegeScroller
      end preOpenCard

      Der Code, der sich jeweils im Stack2 und Stack3 befindet:

      global sScrollerID
      global tScrollerRect, tContentRect, vOffset
      
      on BewegeScroller
      // Only create a scroller on a mobile device
      if environment() is not "mobile" then exit BewegeScroller
      put the rect of group "scrollArea" into tScrollerRect
      put 0,0,(the formattedWidth of group "scrollArea"),(the formattedHeight of group "scrollArea") into tContentRect
      // Create the scroller control
      mobileControlCreate "scroller", "scroller"
      put the result into ssScrollerID
      // Set the properties of the scroller
      mobileControlSet "scroller", "rect", tScrollerRect
      mobileControlSet "scroller", "contentRect", tContentRect
      mobileControlSet "scroller", "visible", true
      mobileControlSet "scroller", "scrollingEnabled", true
      mobileControlSet "scroller", "vIndicator", true
      mobileControlSet "scroller", "vscroll", 0   
      end BewegeScroller
      
      on scrollerDidScroll hOffset, vOffset
         // When the user scrolls move the displayed content
         set the vScroll of group "scrollArea" to vOffset
      end scrollerDidScroll

      Ich hoffe, ihr könnt mit weiterhelfen.
      Danke
      Walter

    • #8473
      Klaus Major
      Verwalter

      Hallo Walter,

      verstehe ich das rihtig, Du benutzt EINEN (den selben) Scroller in verschiedenen Stacks?
      Falls ja, ist das wohl keine allzu gelungene Idee, wie Du festgestellt hast.

      Alle Entwickler, die ich kenne, inklusive der Schotten (LC) selber, löschen den Scroller, wenn die Karte/Stack verlassen wird und erstellen ihn wieder neu bei Bedarf.

      Gruß

      Klaus

    • #8474
      wfr
      Teilnehmer

      Hallo Klaus,

      Das Löschen des Scrollers hatte ich auch schon eingebaut. Habe den Scrollern auch verschiedene Namen gegeben. Jetzt funktioniert genau 1x den Stack wechseln. Dann nicht mehr. Hier nochmal der gesamte Code:

      Stack2 / Card b1:

      on preOpenCard
         global sScrollerID
         global tScrollerRect, tContentRect, vOffset
         BewegeScroller
      end preOpenCard
      
      on closeCard
         // Delete the scroller
         global sScrollerID
      if environment() is not "mobile" then exit closeCard
      mobileControlDelete sScrollerID
      end closeCard

      Stack2:

      global sScrollerID
      global tScrollerRect, tContentRect, vOffset
      
      on BewegeScroller
         // Only create a scroller on a mobile device
         if environment() is not "mobile" then exit BewegeScroller
         put the rect of group "scrollArea" into tScrollerRect
         put 0,0,(the formattedWidth of group "scrollArea"),(the formattedHeight of group "scrollArea") into tContentRect
         // Create the scroller control
         mobileControlCreate "scroller", "my_scroller1"
         put the result into ssScrollerID
         // Set the properties of the scroller
         mobileControlSet "my_scroller1", "rect", tScrollerRect
         mobileControlSet "my_scroller1", "contentRect", tContentRect
         mobileControlSet "my_scroller1", "visible", true
         mobileControlSet "my_scroller1", "scrollingEnabled", true
         mobileControlSet "my_scroller1", "vIndicator", true
         mobileControlSet "my_scroller1", "vscroll", 0   
      end BewegeScroller
      
      on scrollerDidScroll hOffset, vOffset
         // When the user scrolls move the displayed content
         set the vScroll of group "scrollArea" to vOffset
      end scrollerDidScroll

      Stack3 / card c1:

      on preOpenCard
         global sScrollerID
         global tScrollerRect, tContentRect, vOffset
         BewegeScroller
      end preOpenCard
      
      on closeCard
         // Delete the scroller
         global sScrollerID
         if environment() is not "mobile" then exit closeCard
         mobileControlDelete sScrollerID
      end closeCard

      Stack3:

      global sScrollerID
      global tScrollerRect, tContentRect, vOffset
      
      on BewegeScroller
         // Only create a scroller on a mobile device
         if environment() is not "mobile" then exit BewegeScroller
         put the rect of group "scrollArea" into tScrollerRect
         put 0,0,(the formattedWidth of group "scrollArea"),(the formattedHeight of group "scrollArea") into tContentRect
         // Create the scroller control
         mobileControlCreate "scroller", "myscroller_2"
         put the result into ssScrollerID
         // Set the properties of the scroller
         mobileControlSet "myscroller_2", "rect", tScrollerRect
         mobileControlSet "myscroller_2", "contentRect", tContentRect
         mobileControlSet "myscroller_2", "visible", true
         mobileControlSet "myscroller_2", "scrollingEnabled", true
         mobileControlSet "myscroller_2", "vIndicator", true
         mobileControlSet "myscroller_2", "vscroll", 0   
      end BewegeScroller
      
      on scrollerDidScroll hOffset, vOffset
         // When the user scrolls move the displayed content
         set the vScroll of group "scrollArea" to vOffset
      end scrollerDidScroll

      Danke
      Walter

    • #8475
      Klaus Major
      Verwalter

      Die Skripte sehen gut aus, keine Ahnung, was da schief läuft.

      Du hast eine globale Variable namens vOffset, benutzt aber im Handler „on scrollerdidscroll“ einen Parameter gleichen Namens. Muss nichts bedeuten, aber wer weiß…

      Ausserdem würde ich mal versuchen, sSCrollerID als LOKALE Variable pro Stack zu benutzen.

      Aber wie gesagt, alles Schüsse ins Blaue…

    • #8478
      wfr
      Teilnehmer

      Habe den Code umgebaut, aber hat nichts geändert.

      Stack2, card b1:

      on preOpenCard
         local sScrollerID
         local tScrollerRect, tContentRect
         // Only create a scroller on a mobile device
         if environment() is not "mobile" then exit preOpenCard
         put the rect of group "scrollArea" into tScrollerRect
         put 0,0,(the formattedWidth of group "scrollArea"),(the formattedHeight of group "scrollArea") into tContentRect
         // Create the scroller control
         mobileControlCreate "scroller", "my_scroller1"
         put the result into ssScrollerID
         // Set the properties of the scroller
         mobileControlSet "my_scroller1", "rect", tScrollerRect
         mobileControlSet "my_scroller1", "contentRect", tContentRect
         mobileControlSet "my_scroller1", "visible", true
         mobileControlSet "my_scroller1", "scrollingEnabled", true
         mobileControlSet "my_scroller1", "vIndicator", true
         mobileControlSet "my_scroller1", "vscroll", 0   
      end preOpenCard
      
      on closeCard
         // Delete the scroller
         global sScrollerID
      if environment() is not "mobile" then exit closeCard
      mobileControlDelete sScrollerID
      end closeCard

      Stack2:

      on scrollerDidScroll hOffset, vOffset
         // When the user scrolls move the displayed content
         set the vScroll of group "scrollArea" to vOffset
      end scrollerDidScroll

      Stack3, card c1:

      on preOpenCard
         local sScrollerID
         local tScrollerRect, tContentRect, vOffset
         // Only create a scroller on a mobile device
         if environment() is not "mobile" then exit preOpenCard
         put the rect of group "scrollArea" into tScrollerRect
         put 0,0,(the formattedWidth of group "scrollArea"),(the formattedHeight of group "scrollArea") into tContentRect
         // Create the scroller control
         mobileControlCreate "scroller", "myscroller_2"
         put the result into ssScrollerID
         // Set the properties of the scroller
         mobileControlSet "myscroller_2", "rect", tScrollerRect
         mobileControlSet "myscroller_2", "contentRect", tContentRect
         mobileControlSet "myscroller_2", "visible", true
         mobileControlSet "myscroller_2", "scrollingEnabled", true
         mobileControlSet "myscroller_2", "vIndicator", true
         mobileControlSet "myscroller_2", "vscroll", 0   
      end preOpenCard
      
      on closeCard
         // Delete the scroller
         global sScrollerID
         if environment() is not "mobile" then exit closeCard
         mobileControlDelete sScrollerID
      end closeCard

      Stack3:

      on scrollerDidScroll hOffset, vOffset
         // When the user scrolls move the displayed content
         set the vScroll of group "scrollArea" to vOffset
      end scrollerDidScroll

      Ich beschreibe nochmals das Szenario:
      – ich starte das Programm
      – ich springe von stack1 auf stack2 —> scroller funktioniert!
      – ich springe zurück zu stack1
      – ich springe von stack1 auf stack3 —> scroller funktioniert!
      – ich springe zurück zu stack1
      – ich springe von stack1 auf stack2 —-> scroller funktioniert nicht mehr!

      echt mysteriös….

    • #8479
      Klaus Major
      Verwalter

      Hm, Du hast einmal sScrollerID als Lokal und einmal als Global definiert, bitte entscheide Dich. 🙂

      Globale/Lokale Variablen deklariert man am Besten ÜBER allen Handlern im Skript, so kann auch jeder Handler darauf zugreifen:
      Stack2, card b1:

      local sScrollerID, tScrollerRect, tContentRect
      
      on preOpenCard
         local sScrollerID
         local tScrollerRect, tContentRect
         // Only create a scroller on a mobile device
         if environment() is not "mobile" then exit preOpenCard
         put the rect of group "scrollArea" into tScrollerRect
         put 0,0,(the formattedWidth of group "scrollArea"),(the formattedHeight of group "scrollArea") into tContentRect
         // Create the scroller control
         mobileControlCreate "scroller", "my_scroller1"
         put the result into ssScrollerID
         // Set the properties of the scroller
         mobileControlSet "my_scroller1", "rect", tScrollerRect
         mobileControlSet "my_scroller1", "contentRect", tContentRect
         mobileControlSet "my_scroller1", "visible", true
         mobileControlSet "my_scroller1", "scrollingEnabled", true
         mobileControlSet "my_scroller1", "vIndicator", true
         mobileControlSet "my_scroller1", "vscroll", 0   
      end preOpenCard
      
      on closeCard
         // Delete the scroller
         ## Ist aber LOKAL deklariert!
         ## global sScrollerID
         if environment() is not "mobile" then exit closeCard
         mobileControlDelete sScrollerID
      end closeCard

      Dito für: Stack3, card c1:

      Und Dein Stack2 hat kein Skript zu Scrollererstellung.

      Gruß

      Klaus

    • #8503
      wfr
      Teilnehmer

      Hallo Klaus,

      Danke für den Tipp mit den Variablen. Hat aber nichts gebracht.
      Was meinst du mit „Stack2 hat kein Skript zur Scrollerstellung“ ?
      Das oben angefügte Skript erstellt doch den Scroller?!

      lg Walter

    • #8511
      Klaus Major
      Verwalter

      Pardon, mein Fehler, hatte ich übersehen.

    • #8522
      wfr
      Teilnehmer

      Habe das Problem im englischsprachigen Forum gepostet. Mal sehen….

      lg Walter

Ansicht von 8 Antwort-Themen
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.