German Inhalt einer SQL-Datenbank mit Wischen durchblättern

peternmb

Active Member
Licensed User
Hallo,

ich möchte die Inhalte meiner SQL-Datenbank anzeigen und mit Wischen "durchblättern".
Auf jeder Seite (in jedem Panel) werden die Inhalte einer Tabellenzeile angezeigt.
Es gibt die Möglichkeit, die DB nach bestimmten Daten zu durchsuchen oder zu sortieren.

Von der Datenbankseite her funktioniert mein Code schon ganz gut, nur mit dem wischen (=blättern) das bekomme ich absolut nicht hin. Ich wollte dafür das Beispiel "Sliding Panels" umstricken, das kann allerdings nicht funktionieren, weil ich dort beim Start bereits festlegen muss, wieviele Panels erzeugt werden sollen und ich müsste diese auch soweit ich das verstehe sofort bestücken.

Bin für jeden Tipp, Hinweis oder auch für einfache Beispiele sehr dankbar ;)
 

KMatle

Expert
Licensed User
Du willst ja nicht das Panel scrollen, sondern nur den nächsten/vorherigen Satz anzeigen. Dazu brauchst Du quasi nur die Info, in welche Richtung "geswiped" wurde (rechts/links): Links=vorheriger Satz, rechts=nächster.

Dazu folgender Code:

B4X:
Sub Panels_Touch (Action As Int, X As Float, Y As Float)
    Select Action
        Case Activity.ACTION_DOWN
            startX = X
            startY = Y
        Case Activity.ACTION_UP
            If Abs(y - startY) > 20%y Then Return
            If X - startX > 30%x AND btnRight.Enabled = True Then
                ChangePanel(False)
            Else If startX - x > 30%x AND btnLeft.Enabled = True Then
                ChangePanel(True)
            End If
    End Select
End Sub
In x und y wird der STartwert gespeichert (da, wo der Finger aufgesetzt wurde -> Action_Down). In Action_UP (= Finger wieder hochgenommen) werden die dann gültigen x und y Koordinaten gespeichert und ausgewertet.

Wenn Start 100 war und der x-Wert nun 60, dann wurde nach links bewegt. Das Beispiel nutzt 30%x, d.h. wenn mehr als 30% nach links bewegt wurde.

ChangePanel kannst Du ersetzen durch "vorheriger" bzw. "nächster" Satz.
 

peternmb

Active Member
Licensed User
Hallo,

ja, vielen Dank das funktioniert so.

Ich würde allerdings gerne noch eine Art Animation für den Wechsel des Inhaltes hinzufügen, z.B. das den sichtbaren Wechsel des Panels als eine Art umblättern oder wegschieben.
 

KMatle

Expert
Licensed User
Du könntes zwei Panels nehmen. Sprich: Wenn Du nach links wischst, bewegst Du das Panel mit Mypanel1.left (es gehen auch Minuswerte :)) nach links und das zwei bewegst Du mit Mypanel2.left=MyPanel1.left+MyPanel1.widt "rein" (war vorher mit MyPanel2.left=101%x ausserhalb des sichtbaren Bereiches).
 

peternmb

Active Member
Licensed User
Hallo,

mein Panel liegt jetzt auf einem ScrollView, bekomme ich das auch noch irgendwie hin?
Wenn ich die Sub-Routine nur in "Sub scvMain_Touch" ändere bringt das leider nichts :oops:

Du willst ja nicht das Panel scrollen, sondern nur den nächsten/vorherigen Satz anzeigen. Dazu brauchst Du quasi nur die Info, in welche Richtung "geswiped" wurde (rechts/links): Links=vorheriger Satz, rechts=nächster.

Dazu folgender Code:

B4X:
Sub Panels_Touch (Action As Int, X As Float, Y As Float)
    Select Action
        Case Activity.ACTION_DOWN
            startX = X
            startY = Y
        Case Activity.ACTION_UP
            If Abs(y - startY) > 20%y Then Return
            If X - startX > 30%x AND btnRight.Enabled = True Then
                ChangePanel(False)
            Else If startX - x > 30%x AND btnLeft.Enabled = True Then
                ChangePanel(True)
            End If
    End Select
End Sub
In x und y wird der STartwert gespeichert (da, wo der Finger aufgesetzt wurde -> Action_Down). In Action_UP (= Finger wieder hochgenommen) werden die dann gültigen x und y Koordinaten gespeichert und ausgewertet.

Wenn Start 100 war und der x-Wert nun 60, dann wurde nach links bewegt. Das Beispiel nutzt 30%x, d.h. wenn mehr als 30% nach links bewegt wurde.

ChangePanel kannst Du ersetzen durch "vorheriger" bzw. "nächster" Satz.
 

KMatle

Expert
Licensed User
SV's haben ein eigenes Panel und das ist immer schwer, die Events auseinanderzuhalten. Hier mal ein komplettes Beispiel:

B4X:
#Region  Project Attributes
    #ApplicationLabel: B4A Example
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.

End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
   
    Dim MeinPanel As Panel
    Dim MeinLabel As Label
    Dim datenliste As List
   
    Dim xint, yint, startx, starty As Int
   
    Dim AktSatz As Int
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("Layout1")
   
    'Datenliste mit 20 Sätzen
    datenliste.Initialize
    For i = 0 To 19
        datenliste.Add("Satz Nummer " & (i+1))
    Next
   
   
    MeinPanel.Initialize("Pan")
    MeinLabel.Initialize("")
    MeinLabel.TextSize=30
    MeinLabel.Gravity=Gravity.CENTER
    MeinPanel.AddView(MeinLabel,25%x,1%y,50%x,10%y)
   
    Activity.AddView(MeinPanel,0,0,100%x,100%y)
   
    AktSatz=1
    MeinLabel.Text=datenliste.get(AktSatz-1) 'Liste beginnt bei 0
   
End Sub

Sub Pan_Touch (Action As Int, X As Float, Y As Float)
    xint=X
    yint=Y
    Select Action
        Case Activity.ACTION_MOVE
            If X<startx Then
               MeinLabel.Text="<<<<<<<<<<<<<<"   
               MeinLabel.left=MeinLabel.left-40
            Else
               MeinLabel.left=MeinLabel.left+40
               MeinLabel.Text=">>>>>>>>>>>>>>"
            End If
        Case Activity.ACTION_DOWN
            startx = X
            starty = Y
            Log("Down: " & xint & "/" & yint)
        
        Case Activity.ACTION_UP
            Log("Up: " & xint & "/" & yint)
           
            If X - startx > 10%x Then
               Log("rechts")
                If AktSatz>1 Then
                       AktSatz=AktSatz-1
               End If
            Else If startx - X > 10%x  Then
               Log("links")
                  If AktSatz<datenliste.Size Then
                       AktSatz=AktSatz+1
               End If
            End If
            MeinLabel.Left=25%x
            MeinLabel.Text=datenliste.get(AktSatz-1) 'Liste beginnt bei 0
   
    End Select

End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub
 

peternmb

Active Member
Licensed User
Hallo,

vielen Dank für deine Mühe und das Beispiel.

Leider findet sich darin kein ScrollView. Wenn ich versuche das in meinen Code zu integrieren tut sich nichts.
Ich habe es doch richtig verstanden, das ich der Touch-Event auf das Panel und nicht auf das ScrollView bezieht?

Was müsste ich bei deinem zuerst geposteten Code (noch ohne ScrollView) ändern, wenn das Panel jetzt auf einem ScrollView liegt?

Nachtrag:
Ich benötige die Funktion nicht mehr da ich mein Layout so umgestellt habe, dass ich ohne ein ScrollView auskomme. Die Funktion zum Wischen funktioniert tadellos und ich ändere jetzt noch die Panelfarbe beim Füllen mit neuen Inhalten - so ist das sehr übersichtlich :)
 
Last edited:
Top