German Panel mit dem Finger verschieben

peternmb

Well-Known Member
Licensed User
Longtime 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
Longtime 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

Well-Known Member
Licensed User
Longtime 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...
 

peternmb

Well-Known Member
Licensed User
Longtime 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?)
 

peternmb

Well-Known Member
Licensed User
Longtime 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