Italian DoEvents..Non capisco...non capisco :D

udg

Expert
Licensed User
Longtime User
Ciao Massimo,

credo che la confusione nasca dal ritardo con cui viene aggiornata la lista, da un punto di vista grafico.
Per questo ti suggerivo di introdurre un'istruzione listview.invalidate dopo il cambio di colore.
Lo scopo è proprio quello di forzare il redraw della lista e verificare che tutte le righe assumono il nuovo colore.
Siccome le note relative a "invalidate" dicono che il redraw avverrà quando possibile, ritengo sia utile far seguire l'istruzione da un DoEvents, gisto per dare un po' di respiro alla coda degli eventi.

Per le double lines, invece, essendo formate da due distinte labels dovresti poter usare due distinti colori, uno per ciascuna label, che poi, come al solito, verrano ripresi in tutti gli elementi di quel tipo (double lines) presenti nella lista.
Ma questo non ti serve per il caso in esame.

Umberto
 

LucaMs

Expert
Licensed User
Longtime User
Il progettino che ho allegato è in Portrait e non ho impostato la scrollview con le percentuali, per questo non vedi i punteggi. Basta adattare la scrollview. Inoltre, dovresti posizionarla sul riquadro.

Per le trasparenze... ci sto provando, ma qualcosa non va. Non è sufficiente impostare i colori a Colors.Transparent sia nel pannello del CreateItem, sia per le label che per la CheckList stessa! C'è una chiamata tramite reflection, devo guardare meglio. Eventualmente si può interpellare l'autore, Informatix.

Dato che i timer sono nella Activity Gioco, puoi fare più o meno come nel progetto funzionano le animazioni: allo scadere del primo timer (tick) lo disabiliti e abiliti l'altro.

(Main è solo la Activity principale, tutte le altre sono... Activities).
 

LucaMs

Expert
Licensed User
Longtime User
Ah, no, avevo solo dimenticato di impostare l'Alpha della scrollview a 0.

Quindi, ScrollView del designer: Color = Transparent, Alpha = 0
Color del pannello (CreateItem) e delle label a Transparent
cklPunteggi.BackgroundColor = Colors.Transparent
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Ciao udg, ho provato ma non ne trae nessun beneficio.

B4X:
Select Case colore
        Case 0
            SV.SingleLineLayout.Label.TextColor=Colors.White
            SV.Invalidate
            DoEvents
      
        Case 1
            SV.SingleLineLayout.Label.TextColor=Colors.Yellow
            SV.Invalidate
            DoEvents
        Case 2
            SV.SingleLineLayout.Label.TextColor=Colors.Green
            Rix.TextColor=Colors.Green
        Case 3
            SV.SingleLineLayout.Label.TextColor=Colors.Red
            SV.Invalidate
            DoEvents
    End Select

Forse la mossa di Luca è quella più reale anche se, come detto nel suo codice io non vedo i punti ma solo le parole. (quando lo eseguo)
 
Last edited:

udg

Expert
Licensed User
Longtime User
Ciao Massimo,

leggi quest brevissimo post di Erel.
Sembra che cambiare in corsa le property di una LV non sia una buona idea. Le CustomListView o l'idea di Luca dovrebbero aiutarti.
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Grazie Luca. Ho visto solo ora e vedrò di impleentarla nel mio game. Grazie anche a te udg. Speriamo che non abbia problemi. ;)
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Vabbè però! :confused:
Ho aggiornato lo Scale (il mio era il 1.2) mentre quello di Luca era il 1.4 ed aveva in più il .GetScaleTxt e, appenal ancio senza modifiche alcune, mi appare un errore di campo NULL qui nello Scale in obj

B4X:
Public Sub IsActivity(v As View) As Boolean
    Dim obj As Object
    obj = GetParent(v)
    If GetType(obj) = "android.widget.FrameLayout" Then
        Return True
    Else
        Return False
    End If
End Sub

E' la seconda volta che aggiorno una libreria o un modulo e devo rimettere mano ai programmi perché le nuove non funzionano più! :mad:
Ma le nuove feature non dovrebbero migliorare invece di creare problemi?
Viene passata una imageview ma mi risulta null.


B4X:
Dim numLiv As ImageView
'Numero Livelli
numLiv.Initialize("numLiv")
Dim liv As Int
liv=Main.Livello(Main.fndPlayer)+1
numLiv.Bitmap=LoadBitmap(File.DirAssets, liv &".png")
Scale.ScaleView(numLiv)



...alla fine, invece di migliorare, si sta incasinando di più il tutto:(
Spero di ritrovare quella versione 1.2 dello Scale perché TUTTI i miei passaggi (imagini, panel, etc, restirtuiscono errore NULL... e vedo che cvuole STRING come input).
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Sicuro di non aver cambiato qualcosa?
Tra la 1.2 e la 1.4, oltre al mio text, che non è detto sia ideale, tra l'altro, ma non influisce sul tuo errore:

' Version 1.4 2013.11.29
' amended error with height and width <0
'
' Version 1.3 2013.11.16
' added ScaleAllX and ScaleViewX
' this scaling uses only the X scale factor
'
' Version 1.2 2013.09.18
' added HorizontalScrollView


e nemmeno queste dovrebbero.
 

LucaMs

Expert
Licensed User
Longtime User
??? che dico???
Finché non aggiungi la ImageView ad un pannello (o Activity) non "esiste", quindi non puoi scalarla!
Metti lo scale dopo aver aggiunto la ImageView

[anche con la 1.2 non doveva funzionare]
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Ho provato. Ma appena arriva alle chiamate Scale.ScaleView(ogetto) mi da errore.
Ho seguito ma appena entra lo mette come NULL e si blocca con questo messaggio:

java.lang.NullPointerException

Ora provo ma, con la 1.2 funzionava eccome!
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
...Mah! nella versione 1.2 non mi dava nessun errore e nella 1,4 si.
Comunque, Si... ora funziona.
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Grazie per l'interessamento e per la soluzione che Luca ha postato ma penso di aver trovatp
o una soluzione che, se riuscissi a capire come posizionarsi all'ultima riga, sarebbe la più semplice e veloce...overo l'uso della ScrollView con una checkbox, postata QUI
Il problema e che non si capisce come visualizzare l'ultimo campo ella lista.
 
Last edited:

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Riguardo lìinserimento è tutto a posto. Klaus mi hadetto come arrivare all'ultimo campo inserito e la cosa funziona a meraviglia... ora, riorniamo alla domanda principale....ma sti DoEvents mica funzionano tanto bene!
Cioè, danno un leggero ritardo e basta. Non è che attendono la fine del processo (quanto mi mancano i, chiisà perché non mai piaciuti, GOTO).
Almeno, con quelli, se non finiva ritornavi. Ora si potrebbe usare il Do While, ma non penso che le altre azioni aspettino.
Ripetetere per più volte i DoEvents non è una cosa buona, perché dipende la macchina come lavora e quindi potrebbe essere più lento o più veloce.
Ora che testo il gioco, mi accorgo che la musica, sul mio Smart, parte e si sovrappone :eek: per poi tornare normale... mah!
 

LucaMs

Expert
Licensed User
Longtime User
Il goto col doevents c'entra come i cavoli a merenda, per questo non li capisci, forse.

Col goto, famigerato, come sai, saltavi di qua e di là; il doevents "concede" alla CPU di eseguire istruzioni mentre, per esempio, "stai" all'interno di un ciclo. Spesso si usa per permettere il refresh dello schermo.

Dato che ho perso il filo, non ho capito dove vorresti usare i goto o i doevents, dove sono necessari secondo te e perché.
 

LucaMs

Expert
Licensed User
Longtime User
Io, invece, devo mettermi a studiare... ancora la grafica! grrrrrrrrrrrrrrr

Nell'esempio che ho allegato al post #19 (!), l'allineamento del testo delle righe era perfetto su un emulatore, tutt'altro sul mio smartphone.
Il motivo lo so e lo capisco: il background dell'activity va adattato (oppure va adattata la CheckList) ma non ho avuto ancora la pazienza di approfondire, ste cose grafiche sono da mal di testa :mad:
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
HeHeHe, anche tu, Guru :D, hai problemi chiari vedo... mi rassicuro allora sulla mia pippagine.:D:D
Alla fine, come scritto, con questo codice ho risolto:


B4X:
ScrollView1.Initialize(0)   
  pnl = ScrollView1.Panel
  lstChecks.Initialize

chk.TextSize=14 *TextScale
lbl1.TextSize=14*TextScale  
    lstChecks.Add(chk)
  
height=chk.height*0.3
pnl.AddView(chk, 0, height * (IDtxt-1), 50%x, height)
pnl.AddView(lbl1, 37%x, height * (IDtxt-1), 37%x, height)
      
pnl.height = lstChecks.Size * height
pnl.BringToFront
DoEvents
ScrollView1.ScrollPosition = height * IDtxt-1

dove pnl è un panel, chk è un CheckBox a cui passo la parola e lbl1 una Label alla quale passo i punti
...l'unica cosa che c'è di storto è quel height=chk.height*0.3 che ho messo, per adeguare l'altezza in base allo schermo del dispositivo (se uso lo Scale non vedo nulla). Infatti, sul mio dispositivo va bene ma, su un Tablet 7", lo spazio è troppo.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Aho, Guru lo dici a qualcun altro :D

Forse ti risolvo il * 0.3.

Se hai utilizzato il modulo Scale, ho appena trovato un piccolo errore nella routine SetReferenceLayout. La riga:

If cRefWidth < cRefHeight Then

dev'essere invece:

If Width < Height Then
 
Top