German Frage zu ScrollView2D und Canvas

Discussion in 'German Forum' started by Joe73, May 7, 2018.

  1. Joe73

    Joe73 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
     
  2. Joe73

    Joe73 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
     
  3. Joe73

    Joe73 Member Licensed User

    Das macht was es soll, aber ob es der
    Weisheit letzter Schuss ist....?


    Code:
    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(
    6000dip50%y"sv2d")
        canv1.Initialize(sv2d.panel)
        
        
    Activity.AddView(sv2d, 00100%x50%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(
    10dip150dip, (sv2d.panel.Width - 10), 150dipColors.Red, 2dip)
        canv1.DrawLine((sv2d.panel.Width-
    20), 150dip, (sv2d.panel.Width-20) , 50dipColors.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, 50dipColors.Red, 1dip)
            
    End If
            
        
    Next
        
    Activity.Invalidate
    End Sub

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

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

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

    mfg Jürgen
     
  4. klaus

    klaus Expert Licensed User

    Ich würde es so machen um das Scrollen mit einem Grenzwert zu begrenzen:
    Code:
    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.
     
  5. Joe73

    Joe73 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
     
  6. klaus

    klaus Expert Licensed 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.
     
  7. Joe73

    Joe73 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
     
  8. klaus

    klaus Expert Licensed User

    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.
     
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice