German Frage zu ScrollView2D und Canvas

Joe73

Active Member
Licensed User
Hallo,

habe mal wieder eine Frage worüber ich schon das ganze Wochenende grüble...
Ich möchte auf das ScrollView2D.Panel eine Zeichenfläche bringen.
Diese soll z.B. 3000dip breit sein.
Nun zeichne ich darin eine Linie vom Linken zum Rechten Rand (von 10dip nach scrollview2D.Panel.Width-10dip).
Danach möchte ich bei Bedarf das Panel mit der Zeichenfläche schmaler machen und nutze
dazu scrollview2D.Panel.Width - 50dip (z.B.)
Nun wird bei mir zwar die Linie kürzer aber die farbige Zeichenfläche nach dem Ende der Linie wird immer breiter.

Wie muss ich bei der Initialisierung vorgehen?.

mfg Jürgen
 

Joe73

Active Member
Licensed User
wollte ich noch nachreichen:
So sieht es bislang aus ,

Activity.LoadLayout("scrollMain")

sv2d.Initialize(6000dip, 50%y, "sv2d")
canv1.Initialize(sv2d.Panel)
Activity.AddView(sv2d, 0, 0, 100%x, 50%y)
canv1.DrawColor(Colors.Yellow)

Mein Ziel ist, dass die gezeichnete Linie immer bis zum Ende des Panels geht,
nur der Scrollbereich kleiner bzw. größer wird.

gruß Jürgen
 

Joe73

Active Member
Licensed User
Das macht was es soll, aber ob es der
Weisheit letzter Schuss ist....?


B4X:
Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
    Dim sv2d As ScrollView2D
    Dim lbl1, lbl2 As Label
    Private btn1 As Button
    Private btn2 As Button
    Private canv1 As Canvas
    
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("scrollMain")
    
    sv2d.Initialize(6000dip, 50%y, "sv2d")
    canv1.Initialize(sv2d.panel)
    
    Activity.AddView(sv2d, 0, 0, 100%x, 50%y)
    canv1.DrawColor(Colors.Yellow)
    lbl2.TextSize = 30
    lbl2.TextColor = Colors.Black
    lbl2.Text = sv2d.HorizontalScrollPosition
    lbl1.TextSize = 30
    lbl1.TextColor = Colors.Red
    lbl1.Text = sv2d.Width
    makeLine
    
End Sub



Sub Activity_Resume
End Sub

Sub Activity_Pause (UserClosed As Boolean)
End Sub

Sub sv2d_ScrollChanged(PosX As Int, PosY As Int)
    'Log(PosX & " / " & PosY)
    lbl2.Text = PosX   
End Sub


Sub btn2_Click
    sv2d.panel.Width = sv2d.panel.Width - 160
    lbl1.Text = sv2d.panel.Width
    makeLine
End Sub

Sub btn1_Click
    sv2d.panel.Width = sv2d.panel.Width + 160
    lbl1.Text = sv2d.panel.Width
    makeLine
End Sub

Sub makeLine
    canv1.RemoveClip
    canv1.Initialize(sv2d.panel)
    
    canv1.DrawColor(Colors.Yellow)
    
    Dim ste As Int
    ste = Round(sv2d.panel.Width/40)
    If sv2d.panel.Width < 9000 Then
        ste = (sv2d.panel.Width/10)
    End If
    canv1.DrawLine(10dip, 150dip, (sv2d.panel.Width - 10), 150dip, Colors.Red, 2dip)
    canv1.DrawLine((sv2d.panel.Width-20), 150dip, (sv2d.panel.Width-20) , 50dip, Colors.Red, 2dip)
    Log(" sv2d.panel.Width - 10dip = : " & (sv2d.panel.Width - 10))
    Log(" sv2d.panel.Width = : " & (sv2d.panel.Width ))
    For i = 1 To sv2d.panel.Width
        If i Mod (ste) = 0 Then
            'Log (" i Mod = " & i & "  ste :  " & ste )
            canv1.DrawLine(i, 150dip, i, 50dip, Colors.Red, 1dip)
        End If
        
    Next
    Activity.Invalidate
End Sub


Das hat geholfen,
aber immer wieder neu initialisieren...?

B4X:
    canv1.RemoveClip
    canv1.Initialize(sv2d.panel)


Vielleicht hat da jemand ne andere Idee und man kann das eleganter lösen...

mfg Jürgen
 

klaus

Expert
Licensed User
Longtime User
Ich würde es so machen um das Scrollen mit einem Grenzwert zu begrenzen:
B4X:
Private Sub sv2d_ScrollChanged(PosX As Int, PosY As Int)
    If PosX > GrenzWert Then
        sv2d.HorizontalScrollPosition = GrenzWert
    End If
    'Dein Code
End Sub
Eine Frage: Warum benutzt Du eine ScrollView2D, Du scrollst doch nur waagrecht.
Für das, würde eine HorizontalScrollview reichen.
 

Joe73

Active Member
Licensed User
Hallo,

danke für den Hinweis bzw. Tipp.
Ja, mein Beispiel zeigt nur das horizontale Scrollen, wollte eventuell mir noch die vertikale
Scroll-Möglichkeit offen halten.
Nun ist ein weiteres Problem aufgetaucht.
Wenn das Panel in der Breite größer 16384 (2 hoch 14) wird, dann wird die Zeichnung nicht
mehr angezeigt, auch der Hintergrund bleibt weiß...
Das Panel lässt sich aber noch scrollen...

mfg Jürgen
 

klaus

Expert
Licensed User
Longtime User
Das hatte Ich auch gesehen.
Ich befürchte dass es eine Grössengrenze fur den Canvas gibt.
Ich weiss nicht ob diese Grenze an B4A oder an Android liegt.
Habe gegoogelt, aber nichts gefunden.
Ich befürchte auch dass Du mit so grossen Bitmaps so wie so Speicherprobleme bekommen würdest.
Mit diesem Code, auf meinem Samsung Galaxy S6:
sv2d.Initialize(2048dip, 50%y, "sv2d")
Activity.AddView(sv2d, 0, 0, 100%x, 50%y)

Mit einer Bitmapgrösse von 36700160 (2048dip) Bytes wird gezeichnet und mit 36718080 (2049dip) nicht mehr.
 

Joe73

Active Member
Licensed User
Hallo Klaus,

ich hatte versucht, zum Testen, die Höhe des Panels zu veringern.
Die Grenze bei der Breite von 16384 blieb bestehen.
Übrigens, bei OnePlus 5 konnte ich die Breite auf 6000dpi einstellen,
es funktionierte noch.
Liegt vielleicht auch an den 8GB RAM...?

Gruß Jürgen
 

klaus

Expert
Licensed User
Longtime User
Liegt vielleicht auch an den 8GB RAM...?
Weiss Ich nicht.
Ich glaube nicht, denn Android teilt einen bestimmten Speicherplatz jedem Programm zu, der nichts mit dem globalen Speicher des Gerätes zu tun hat.
Aber Ich habe in diesem Bereich keine Erfahrung.
Stelle die Frage mal im Englischen Forum, Erel hat hier bestimmt eine konkretere Antwort als ich.
 
Top