Italian Circle ProgressBar Basata su Timer

Schakalaka

Active Member
Licensed User
Longtime User
ciao a tutti.
qualcuno ha mai provato ad ottenere questo risultato??


Cercando nel forum, ho trovato questo, che potrebbe essere utile:

ho modificato la classse in modo che venisse visualizzato il timer

B4X:
Private Sub DrawValue(Value As Float)
    cvs.ClearRect(cvs.TargetRect)
    cvs.DrawCircle(cx, cy, radius, clrEmpty, False, stroke)
    If myMaxMillisecs = 0 Then
        mLbl.Text = "Claim BTC"
    Else ' Show m:ss by scaling maxMilliseconds
        Dim lblMillisecs As Long = myMaxMillisecs * (Value / 100) ' Adjust code here to round up or down to next second
        mLbl.Text =    ConvertTicksToTimeString(lblMillisecs)
    End If
    Dim startAngle = -90, sweepAngle = Value / 100 * 360 As Float

    If Value < 100 Then
        Dim p As B4XPath
        p.InitializeArc(cx, cy, radius + stroke + 1dip, startAngle, sweepAngle)
        cvs.ClipPath(p)
        cvs.DrawCircle(cx, cy, radius - 0.5dip, clrFull, False, stroke + 1dip)
        cvs.RemoveClip
    Else
        cvs.DrawCircle(cx, cy, radius - 0.5dip, clrFull, False, stroke + 1dip)
    End If
    cvs.Invalidate
End Sub

Sub ConvertTicksToTimeString(t As Long) As String
    Dim  hours, minutes, seconds As Int
    hours = t / DateTime.TicksPerHour
    minutes = (t Mod DateTime.TicksPerHour) / DateTime.TicksPerMinute
    seconds = (t Mod DateTime.TicksPerMinute) / DateTime.TicksPerSecond
    Return NumberFormat(minutes, 2, 0) & ":" & NumberFormat(seconds, 2, 0)
End Sub

and now it display as "05:00"

i hav edefine myMaxMillisecs as int on class


Now i need to add a timer, so:


B4X:
(in Process_Globals)

Dim clickTimer as timer

'--------------------------------------------------------'--------------------------------------------------------'--------------------------------------------------------

(Sub Activity_Create)

clickTimer.initialize("clickTimer",5000)

'--------------------------------------------------------'--------------------------------------------------------'--------------------------------------------------------

Sub Button1_Click

    timer.Enabled = True


End Sub

'--------------------------------------------------------'--------------------------------------------------------'--------------------------------------------------------

Sub clickTimet_Tick

mLbl.Text = a ogni tick il timer dovrebbe diminuire ( 05:00-> 04:59-> 04:58-> 04:57...........00:01-> "Hello world" quando il valore della barra è diventa 100... :oops:??
(defined in clas as public)

End Sub


'--------------------------------------------------------'--------------------------------------------------------'--------------------------------------------------------

Non riesco a capire come sincronizzare la barra ed il timer...
 

udg

Expert
Licensed User
Longtime User
Nel tuo esempio il timer scatta ogni 5 secondi; è voluto?
 

Schakalaka

Active Member
Licensed User
Longtime User
Dimentico sempre che voglio (devo) dedicare più (?) tempo ad una mia app e mi metto a rispondere a tutto spiano!

Considerando la tua esperienza, impieghi molto meno tempo a lavorare direttamente su qualcosa, che ha seguire una discussione con informazioni spezzettate e spesso da interpretare (le mie intendo) ????

Facciamo prima se alleghi un progetto di prova, da correggere
Ecco qui.
ho modificato l' esempio contenuto nel post della classe.
 

Attachments

  • B4A Samples.zip
    103.8 KB · Views: 196

Schakalaka

Active Member
Licensed User
Longtime User
Devo partire da 05:00 ed arrivare a 0
quando sono a 0, visualizzo una scritta che cliccata, fa partire il timer
 

Schakalaka

Active Member
Licensed User
Longtime User
?
si magari potevo modificarlo un po di piu l' esempio...
Si, il button click non serve, e neanche la seconda circlebar.

Grazie che mi fai ragionare un po
Prova con questo. ho aggiunto una label per l' attivazione del timer, che scompare e si disabilita alla partenza del timer


B4X:
https://drive.google.com/file/d/1A5MSM8cSejSigetg2SbUN2K7U9PnmO-7/view?usp=sharing
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Non dovresti modificare quella classe (CircularProgressBar), inserendoci tue Label. Al limite potresti modificarla, se servisse, aggiungendoci degli eventi.
Non la conosco, gli sto dando un'occhiata, e vedo "cose strane", relative a Sleep, Resumable...
Meglio che prima vada (io) a guardare il thread relativo.

(Troppo lavoro; non è per te, ovviamente, è che non dovrei impelagarmi in certe cose, se voglio sviluppare qualcosa per il sottoscritto. A meno che Erel non decida di pagarmi ?)
 

Schakalaka

Active Member
Licensed User
Longtime User
ah, no, la label, l' ho aggiunta nel designer e nella main activity ed ho tolto il click button e la seconda progressbar perchè non servono.
nell' esempio di Erel, al click, la barra si caricava di un valore random da 0 a 100.
Sempre in quella discussione, anche ad un altro utente serviva visualizzare il timer, al posto del del valore.
Ha modificato la Private Sub DrawValue, come sopra, che ho leggermente modificato, utilizzando Sub ConvertTicksToTimeString per visualizzzare il testo alla fine del count down.
il problema, rimane comunque che la barra si carica piu veloce del timer... ?

Al proposito di "impelagamenti", questo è un pezzo di un' app, che utilizza anche mysql & php ?
 

LucaMs

Expert
Licensed User
Longtime User
ah, no, la label, l' ho aggiunta nel designer
Io la vedo (vedevo, perché ho poi ho preso la classe originale di Erel) dentro la classe.

Il punto è che quella classe non è nata per "cronometri", ma per valori da 0 a 100. Non solo...

Penso che il problema principale sia che quando imposti un valore della CircularProgressBar (chiamiamola CPB, che altrimenti solo per scriverne il nome arriviamo ad agosto ?), all'interno di questa viene eseguita un'animazione, di durata X che, giustamente, non ferma il flusso di esecuzione del progetto.
Per cui, se imposti CPB.Value = 50 (ammesso che tu abbia calcolato bene questo 50) si fa tutta una bella animazione da 0 a 50, suppongo (e tu dovresti pure attendere che l'abbia completata, cosa che non puoi fare se non ci aggiungi vario codice).

Insomma, se puoi cerca una View diversa, altrimenti c'è da lavorarci non poco (cosa che adesso proprio non mi sento di fare, scusami) e anche modificare la CPB.
 

Sagenut

Expert
Licensed User
Longtime User
Non si possono impostare i valori min e max a 0 e 300 e fare avanzamenti di 1 secondo?
Oppure usare 0 - 100 e fare una variabile che aumenta di 0.3333 ogni secondo e prendere solo il valore intero.
 

LucaMs

Expert
Licensed User
Longtime User
Non si possono impostare i valori min e max a 0 e 300 e fare avanzamenti di 1 secondo?
Oppure usare 0 - 100 e fare una variabile che aumenta di 0.3333 ogni secondo e prendere solo il valore intero.
Eh, devo guardare bene come sia fatta la classe; anche perché probabilmente ho scritto una cosa sbagliata:
si fa tutta una bella animazione da 0 a 50
Non credo che sia così, altrimenti non sarebbe una "progress" bar; suppongo che se imposti il valore 50 e successivamente 60, la seconda impostazione gli faccia fare l'animazione solo da 51 a 60.

Ovviamente, oramai ci sono e, fatta una pausa di ben 5 minuti, penso che cercherò la soluzione ?
 

Sagenut

Expert
Licensed User
Longtime User
Io farei un timer impostato ad 1 secondo, 1 variabile float globale che viene incrementata di 0.3334 ad ogni Tick e che viene passata in una variabile Int per averne solo l'intero.
L'intero viene dato alla progress bar che sarà a 100 alla fine dei 5 minuti.
 

LucaMs

Expert
Licensed User
Longtime User
E se cambiassi il condizionale con un indicativo presente?
Ovvero, anziché:
Io farei...
scrivessi:
Io faccio...
?

1 - dimostreresti anche a te stesso le tue capacità (sulle quali io confido!)

2 - mi solleveresti da un compito che in questo momento sto "svolgendo" a "pezzi e bocconi" (lo stavo facendo, modificando non poco anche la classe di Erel, ma ho ricevuto una telefonata interessantissima ed inoltre probabilmente tutte le mie modifiche sono eccessive, non indispensabili (anche se forse utili, come l'aggiunta di uno o più eventi).

Se mi dai l'OK, ovvero che ti impegni e lo fai tu... altrimenti il "povero" (magari è miliardario ?) @Schakalaka dovrà aspettare chissà quanto.

[Sembra un nick arabo e poi è più italiano di me ?]
 

Sagenut

Expert
Licensed User
Longtime User
Uso il condizionale perché sto proponendo la mia soluzione in mezzo ad altre.
Sono al lavoro e ho qualche impegno subito dopo.
Se @Schakalaka non giunge al risultato con le indicazioni fornite sarò lieto di allegare un esempio appena mi è possibile.
Altrimenti sei autorizzato a mostrargli tu un esempio con le soluzioni proposte. ?
 

LucaMs

Expert
Licensed User
Longtime User
?

Beh, vediamo, magari nel frattempo ha già risolto o sta per risolvere.
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…