German dynamische Objekte und Gesten

bonap

Member
Hallo,

ich möchte Objekte zur Laufzeit erzeugen und dann hin und her schieben können. Probieren tue ich es mit GestureDetector.
Die objekte erzeuge ich so:
B4X:
Sub Button1_Click
    zaehler=zaehler +1
    Dim btn As Button
    btn.Initialize("btn")
    btn.Text="test" & zaehler
    btn.Tag=zaehler
    btn.Color=Colors.Green
    Activity.AddView(btn,20dip,20dip,120dip,50dip)
    gd.SetOnGestureListener(btn,"Gest")
End Sub

Im event Drag versuche ich das Objekt aufzulösen:
B4X:
Private Sub Gest_onDrag(deltaX As Float, deltaY As Float, MotionEvent As Object)
    Dim bt As Button
    bt=Sender
    
    bt.Left=Max(0,Min(bt.Left+deltaX,100%x-bt.Width))
    bt.Top=Max(0,Min(bt.Top+deltaY,100%y-bt.Height))
    
End Sub

Private Sub Gest_onDoubleTap(X As Float, Y As Float, MotionEvent As Object)
    Dim bt As Button
    bt=Sender
    
    
    MsgboxAsync(bt.Tag,"")
End Sub

Das onDouble_Event habe ich zum testen eingefügt. Leider wird das Objekt nicht aufgelöst , d.h. im Double_Event wird als Tag
immer das letzte Wert angezigt und nicht der vom Objekt. Dementsprechend ist das Verhalten beim Drag, also andere Objekte werden
bewegt. Was und wie muss ich ändern, damit ich das Vorhaben umsetzen kann?

Vielen Dank
 
Last edited:

bonap

Member
Hallo,

ich möchte Objekte zur Laufzeit erzeugen und dann hin und her schieben können. Probieren tue ich es mit GestureDetector.
Die objekte erzeuge ich so:
B4X:
Sub Button1_Click
    zaehler=zaehler +1
    Dim btn As Button
    btn.Initialize("btn")
    btn.Text="test" & zaehler
    btn.Tag=zaehler
    btn.Color=Colors.Green
    Activity.AddView(btn,20dip,20dip,120dip,50dip)
    gd.SetOnGestureListener(btn,"Gest")
End Sub

Im event Drag versuche ich das Objekt aufzulösen:
B4X:
Private Sub Gest_onDrag(deltaX As Float, deltaY As Float, MotionEvent As Object)
    Dim bt As Button
    bt=Sender
   
    bt.Left=Max(0,Min(bt.Left+deltaX,100%x-bt.Width))
    bt.Top=Max(0,Min(bt.Top+deltaY,100%y-bt.Height))
   
End Sub

Private Sub Gest_onDoubleTap(X As Float, Y As Float, MotionEvent As Object)
    Dim bt As Button
    bt=Sender
   
   
    MsgboxAsync(bt.Tag,"")
End Sub

Das onDouble_Event habe ich zum testen eingefügt. Leider wird das Objekt nicht aufgelöst , d.h. im Double_Event wird als Tag
immer das letzte Wert angezigt und nicht der vom Objekt. Dementsprechend ist das Verhalten beim Drag, also andere Objekte werden
bewegt. Was und wie muss ich ändern, damit ich das Vorhaben umsetzen kann?

Vielen Dank



Hallo,

hat keiner eine Idee? Hat so ein Thema noch keiner auf dem Tisch gehabt?
 

klaus

Expert
Licensed User
Longtime User
Ich habe noch nie mit der GestureDetector Bibliothek gearbeitet, deshalb hatte ich auch nicht geantwortet.
Es wäre für uns einfacher wenn Du dein Testprojekt als zip Datei posten würdest.
Dann könnten wir sehen was Du schon wie gemacht hast und dann weiter helfen.
Zip Datei erstellen:

1619087859801.png
 

bonap

Member
Ich habe noch nie mit der GestureDetector Bibliothek gearbeitet, deshalb hatte ich auch nicht geantwortet.
Es wäre für uns einfacher wenn Du dein Testprojekt als zip Datei posten würdest.
Dann könnten wir sehen was Du schon wie gemacht hast und dann weiter helfen.
Zip Datei erstellen:
View attachment 112104

Vielen Dank für die Antwort. Ich habe die Zip dran gehängt, hoffe es hat geklappt.
Vielleicht gibt es ja eine Alternative zur Gesturedetector-Bibliothek.

Danke
 

Attachments

  • gestentest2.zip
    9.3 KB · Views: 67

klaus

Expert
Licensed User
Longtime User
Beiliegend eine geänderte Version.
Die Lösung steht in der ersten Seite des Gesture Detector Threads.
Note: you have to create an instance of GestureDetector (with Dim) for each view you want to bind to the detector with SetOnGestureListener.
Das hast Du nicht gemacht. Du hast gd nur einmal deklariert.
Die Sub Button1_Click Routine:

B4X:
Sub Button1_Click
    zaehler=zaehler +1
    Dim btn As Button
    btn.Initialize("btn")
    btn.Text="test" & zaehler
    btn.Tag=zaehler
    btn.Color=Colors.Green
    Activity.AddView(btn,20dip,20dip,120dip,50dip)
    Private gd As GestureDetector
    gd.SetOnGestureListener(btn,"Gest")
End Sub
 

Attachments

  • gestentest3.zip
    9.3 KB · Views: 76

bonap

Member
Beiliegend eine geänderte Version.
Die Lösung steht in der ersten Seite des Gesture Detector Threads.
Note: you have to create an instance of GestureDetector (with Dim) for each view you want to bind to the detector with SetOnGestureListener.
Das hast Du nicht gemacht. Du hast gd nur einmal deklariert.
Die Sub Button1_Click Routine:

B4X:
Sub Button1_Click
    zaehler=zaehler +1
    Dim btn As Button
    btn.Initialize("btn")
    btn.Text="test" & zaehler
    btn.Tag=zaehler
    btn.Color=Colors.Green
    Activity.AddView(btn,20dip,20dip,120dip,50dip)
    Private gd As GestureDetector
    gd.SetOnGestureListener(btn,"Gest")
End Sub

Hallo Klaus,

vielen Dank. Tut mir leid das ich so blind war.
 
Top