German Panel mit dem Finger verschieben

peternmb

Active Member
Licensed User
Hallo, ich möchte wie der Titel schon sagt ein Panel per Finger verschieben, anschließend die Position für eine Wiederverwendung speichern. Gibt es da einen Event "move" oder etwas ähnliches?
 

klaus

Expert
Licensed User
Mit diesem Code:
B4X:
Sub Process_Globals
    Dim x0, y0, pnlLeft, pnlTop As Float
End Sub

Sub Globals
    Dim pnlTest As Panel
End Sub

Sub Activity_Create(FirstTime As Boolean)
    pnlTest.Initialize("pnlTouch")
    pnlTest.Color = Colors.White
    Activity.AddView(pnlTest, 100dip, 100dip, 100dip, 100dip)
End Sub

Sub Activity_Touch (Action As Int, X As Float, Y As Float)
    Select Action
    Case Activity.ACTION_DOWN
        x0 = X
        y0 = Y
        pnlLeft = pnlTest.Left
        pnlTop = pnlTest.Top
    Case Activity.ACTION_MOVE
        pnlTest.Left = pnlLeft + X - x0
        pnlTest.Top = pnlTop + Y - y0
    Case Activity.ACTION_UP
    End Select
End Sub
pnlLeft und pnlTop beinhalten die Position des Panels.
 

peternmb

Active Member
Licensed User
Hallo Klaus,

vielen Dank für die blitzschnelle Antwort. Es geht so leider nicht, denn:
Das Panel liegt auf einem ScrollView und ich verschiebe nur dieses ScrollView.
Der ScrollEvent scheint durch das Panel durchzugehen - ich weiss leider nicht, wie ich das besser erklären soll...
 

klaus

Expert
Licensed User
Du hast eine Antwort auf deine Frage bekommen.
Wenn Du speziefische Bedingungen hast musst Du die auch mitteilen.
Meines Wissens nach geht das nicht weil das Touch Event von der ScrollView verbraucht wird.
 

peternmb

Active Member
Licensed User
Ja, meine Frage war vielleicht etwas zu allgemein :cool:
Ich habe mir schon fast gedacht, dass das nicht so einfach oder sogar nicht möglich ist. Ich hatte an eine Lösung ähnlich dem Verschieben der Icons auf meinem Desktop gedacht, also das Panel einen Moment gedrückt halten um es dann zu verschieben...

Trotzdem vielen Dank für deine Mühe und noch einen schönen Feiertag (ist überhaupt heute in der Schweiz Feiertag?)
 

klaus

Expert
Licensed User

peternmb

Active Member
Licensed User
...Vielleicht gibt es eine Lösung mit der Gesture Detector, habe diese aber noch nie benutzt.
Toller Tipp, funktioniert mit wenigen Zeilen Code aus dem Beispiel
B4X:
Sub Globals
Dim GD As GestureDetector

...
pnlErfassung.LoadLayout("erfassung")   
GD.SetOnGestureListener(pnlErfassung, "Gesture")
...

Sub Gesture_onDrag(deltaX As Float, deltaY As Float, MotionEvent As Object)
    pnlErfassung.Left = Max(0, Min(pnlErfassung.Left + deltaX, 100%x - pnlErfassung.Width))
    pnlErfassung.Top = Max(0, Min(pnlErfassung.Top + deltaY, 100%y - pnlErfassung.Height))
End Sub
 
Top