Italian Circle ProgressBar Basata su Timer

ivanomonti

Expert
Licensed User
Longtime User
CircularProgressBar1.Value=CircularProgressBar1.Value+(100/60) in un minuto fa il giro completo esatto, sempre se ho capito quello che stavate dicendo :-(

B4X:
#Region Project Attributes
    #MainFormWidth: 600
    #MainFormHeight: 600
#End Region

Sub Process_Globals
    Private fx As JFX
    Private MainForm As Form
    Private CircularProgressBar1 As CircularProgressBar
    Dim timer As Timer
End Sub

Sub AppStart (Form1 As Form, Args() As String)
    MainForm = Form1
    MainForm.RootPane.LoadLayout("Layout1") 'Load the layout file.
    MainForm.Show
    timer.Initialize("timer",1000)
    timer.Enabled=True
End Sub

'Return true to allow the default exceptions handler to handle the uncaught exception.
Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
    Return True
End Sub

Sub timer_tick
    CircularProgressBar1.Value=CircularProgressBar1.Value+(100/60)
End Sub
 

Sagenut

Expert
Licensed User
Longtime User
Esatto
 

LucaMs

Expert
Licensed User
Longtime User
Chiaro, fai il rapporto tra i 100 - valore massimo della "bar" e 60, ma perché la tua unità di misura è il secondo, ovvero i 1000 tick del timer (non è detto che tu voglia cambiare il valore della bar ogni secondo).

Comunque, lasciando fisso quel 1000 del timer e volendo fargli fare il giro completo in un minuto, 100/60 va bene ma andrebbe messo in una variabile decimale globale, altrimenti viene calcolato ogni volta nell'evento Tick.

Ecco perché nel mio progetto di prova c'è questa variabile mBarIncr (o mBarIncrement, non ricordo). Poi, se vuoi che impieghi 5 minuti, semplicemente la imposti a 5 * sé stessa (una sola volta, ovviamente, non nel Tick).
 

Sagenut

Expert
Licensed User
Longtime User
Comunque, lasciando fisso quel 1000 del timer e volendo fargli fare il giro completo in un minuto, 100/60 va bene ma andrebbe messo in una variabile decimale globale, altrimenti viene calcolato ogni volta nell'evento Tick.
[OT]
Domanda:
in questo caso sarebbe ininfluente, ma avere una variabile Global occuperebbe memoria per mantenerla mentre il calcolo al volo no.
Giusto? Sbagliato?
Immaginando un progetto esteso ogni variabile risparmiata è una cosa buona, o no?
Tralasciando concetti di comodità, leggibilità e simili.
[/OT]
 

LucaMs

Expert
Licensed User
Longtime User
Non sapevo che esistessero anche quei tag ?

Il peso di una singola variabile globale è davvero irrilevante, mentre eseguire un calcolo inutilmente decine, se non centinaia o migliaia di volte, è un peso per la CPU e se il tuo fosse un server, questo sarebbe importante.

Senza contare che per eseguire calcoli la "macchina" userà dei buffer di memoria e forse ne creerà di nuovi ogni volta, anziché riutilizzare lo stesso per lo stesso codice sorgente (forse sì).

Cmq, è anche una questione "formale", di logica.
 

LucaMs

Expert
Licensed User
Longtime User
Nel caso specifico, poi, c'è anche un altro motivo: il calcolo 100/60 è solo un rapporto che dovrai adattare all'effettiva durata delle tua "animazione" completa.
Voglio dire, come già "detto" a dire il vero, che per un'animazione (giro completo) della durata di 5 minuti o 20 secondi, dovresti andare a modificare la routine Tick e "logicamente" non è quello il "luogo" in cui fare quel calcolo (oltre a far sprecate tempo CPU).

Se poi ci pensi, fargli fare il calcolo in quell'evento, sballerebbe (di millesimi, probabilmente) i tempi - esempio di un cronometo.
 

udg

Expert
Licensed User
Longtime User
Non ho seguito il thread né gli esempi, ma avevate notato che nel primo post c'era questa istruzione?
sweepAngle = Value / 100 * 360 As Float

Avendo il Value tra 0 e100, generava l'angolo dell'arco incrementandolo man mano. Ma chi dice che Value debba essere per forza limitato a100? Se in quella formula cambio il 100 in 300 avrò l'equivalente dei 5 minuti e così via. Magari bisognava solo semplificare quella sub e far sì che venisse richiamata ad ogni tick del timer (fermando tutto al completamento/superamento dell'angolo giro). Lascio a voi determinare se sia una buona idea o meno, visto che mi sono fermato lì e quindi non so come siete andati avanti.
 

udg

Expert
Licensed User
Longtime User
Se non puoi definirla tu come costante (questo sarebbe un gran aiuto per il compilatore), definirla come variabile globale avrebbe (come dicevi) il vantaggio di eseguire il calcolo un'unica volta (magari in fase di init o di start della procedura). In genere le variabili globali comportano rischi di contaminazione (pezzi di codice in moduli diversi che accedono e modificano un valore globale), ma usate correttamente e con parsimonia agevolano le cose. Le variabili locali (alle procedure) hanno il vantaggio di essere allocate sullo stack e quindi "svanire" a seguito del return al chiamante. Se volete, le variabili locali aiutano a pensare ad una procedura come ad una black-box che ha tutti gli elementi per lavorare (a parte i paramentri in ingresso).
 

LucaMs

Expert
Licensed User
Longtime User
[OT]
(Ho imparato subito i nuovi tag; malgrado l'età avanzata - gli avanzi non si buttano mai - metabolizzo ancora bene ?).

"Qua bigna" (= si dovrebbe, sarebbe utile):

1 - sviluppare un'app che ti prepari un toast, tramezzino, panino ad un tuo semplice fischio;
2 -dovremmo usare quei pochi neuroni rimasti - soprattutto a voi ? - per escogitare un modo per "fare" mooolti soldi, milioni (e non suggeritemi: "La banda degli onesti").

Ad esempio, e solo come esempio, di questi tempi non sfruttare il fatto che grazie ad Internet sia teoricamente possibile farsi dare 10c da un paio di miliardi di persone, è da "irresponsabili"!
[/OT]
 

Sagenut

Expert
Licensed User
Longtime User
@Schakalaka ti lascio la mia ultima Visione della cosa, visto che poi oggi non avrò accesso al pc.
In questo esempio c'è anche come creare una stringa colorata con diversi Font Size per essere più simile a quanto hai mostrato nel primo post.
 

Attachments

  • Circular Countdown.zip
    10.4 KB · Views: 186

LucaMs

Expert
Licensed User
Longtime User
Prima nota: Do - oppure in senso "contabilistico" ?:

Guardare gli avvisi nel tab Log e...
impostare come minimo:
android:targetSdkVersion="28"

Seconda: non dare ai progetti e layout il "nome" "1", non prendete il brutto vizio che ha Erel ? (Erel, mi leggi? Togliti questo brutto vizio ;))
 

Sagenut

Expert
Licensed User
Longtime User
Guardare gli avvisi nel tab Log e...
impostare come minimo:
android:targetSdkVersion="28"
Ho utilizzato il progetto originale di @Schakalaka e non volevo creare confusione perchè poi magari bisogna anche impostare il Path Android.jar al 29
Seconda: non dare ai progetti e layout il "nome" "1"
Quì doppia risposta:
- ho usato il progetto di @Schakalaka
- stò scappando e ho buttato la modifica al volo.
Però concordo pienamente sul fatto di nominare correttamente i progetti e i Layout.
 

LucaMs

Expert
Licensed User
Longtime User
1589367164909.png



Credo che le dimensioni del testo non siano perfettamente calibrate :)
 

Sagenut

Expert
Licensed User
Longtime User
Da me si vedeva diversamente. ?
E non c'è la Sub per adattare il testo.
Devo smettere di fare esempi al volo.
Ma non posso dare nemmeno tutto pronto a @Schakalaka
Qualcosa dovrà fare anche lui, no? ?
 
Top