Italian Chi mi da una dritta sulla risoluzione video?

dibesw

Active Member
Licensed User
Longtime User
Ciao a tutti,
una cosa che non ho ancora capito è questa:
è possible creare più layout per il tipo di dispositivo sul quale andrà installata l'applicazione.

device.jpg


Ma una volta disegnate le maschere come fa l'applicazione a capire su che tipo di dispositivo è installato?
Cioè come fanno ad adattarsi le maschere in automatico.
Da alcune prova che ho effettuato queste maschere non si adattano.

Grazie anticipato.
Amedeo
 

LucaMs

Expert
Licensed User
Longtime User
In effetti è una delle cose più complicate.

Dal mio punto di vista (potrei sbagliare, ovviamente) si dovrebbero creare soltanto un layout per il portrait ed uno per il landscape (sempreché l'app debba funzionare in entrambi i modi, altrimenti uno solo di questi).

Poi è lo script (o, nel mio caso, il modulo Scale di Klaus) che adatta la grafica (a me basta aggiungere il modulo, due righe di codice nella Main Acvitity_Create:
B4X:
    Scale.Initialize
Scale.ScaleAll(Activity, True)

e soltanto la seconda riga nelle Acvitity_Create delle altre Activities.
 

lock255

Well-Known Member
Licensed User
Longtime User
@LucaMs mi posteresti il link del modulo Scale che ha realizzato Klaus, che non lo riesco a trovare?
 

lock255

Well-Known Member
Licensed User
Longtime User
Ottimo, secondo te questo sistema è migliore rispetto a settare ogni componente in questo modo? (che utilizzo per le mie app):
B4X:
pnlMain.SetLayout(0%x, 0%y, 100%x, 100%y)
 

LucaMs

Expert
Licensed User
Longtime User
Per il pannello a tutto schermo va benissimo anche quello.

Ma, come ho scritto sopra, la funzione Scale.ScaleAll adatta tutta la grafica, comprese le eventuali views all'interno del pannello.

Unica cosa da specificare: se poi tu dovessi aggiungere altre views da codice, DOPO aver lanciato Scale.ScaleAll, utilizzerai Scale.ScaleView(TuaNuovaView)
 

dibesw

Active Member
Licensed User
Longtime User
Per il pannello a tutto schermo va benissimo anche quello.

Ma, come ho scritto sopra, la funzione Scale.ScaleAll adatta tutta la grafica, comprese le eventuali views all'interno del pannello.

Unica cosa da specificare: se poi tu dovessi aggiungere altre views da codice, DOPO aver lanciato Scale.ScaleAll, utilizzerai Scale.ScaleView(TuaNuovaView)

Grazie anche da parte mia;
ho un dubbio per le view inserite da codice:
se l'istruzione è del tipo
B4X:
        Label1.Initialize("")
        Panel1.AddView(Label1,80dip,5dip,240dip,30dip)
        Label1.Color=Colors.Black
        Label1.Tag="Label1"
        Label1.TextSize=16
        Label1.TextColor=Colors.Yellow
        Label1.Text=Text1
        Scale.ScaleView(Label1)
perchè il ridimensionamento non funziona?
 

LucaMs

Expert
Licensed User
Longtime User
Dovrebbe funzionare. Ma il Panel1 è già scalato?

Spiego meglio, forse il codice non è nel posto giusto (seguito da qualche altro scale.scaleAll?).

Activity_Create...
Activity_LoadLayout("NomeTuoLayout")
Scale.Initialize
Scale.ScaleAll(Activity, True)

da questo punto in poi, se aggiungi altre view tramite codice, dovresti utilizzare Scale.ScaleView(LabelAggiunta) come hai fatto nel tuo codice e dovrebbe funzionare.

Se il panel è stato caricato con Activity_LoadLayout, dopo le due righe successive, esso viene scalato.

Altrimenti, se lo hai aggiunto tramite codice, utilizza Scale.ScaleAll(Panel1, True)
 

dibesw

Active Member
Licensed User
Longtime User
Dovrebbe funzionare. Ma il Panel1 è già scalato?

Spiego meglio, forse il codice non è nel posto giusto (seguito da qualche altro scale.scaleAll?).

Activity_Create...
Activity_LoadLayout("NomeTuoLayout")
Scale.Initialize
Scale.ScaleAll(Activity, True)

da questo punto in poi, se aggiungi altre view tramite codice, dovresti utilizzare Scale.ScaleView(LabelAggiunta) come hai fatto nel tuo codice e dovrebbe funzionare.

Se il panel è stato caricato con Activity_LoadLayout, dopo le due righe successive, esso viene scalato.

Altrimenti, se lo hai aggiunto tramite codice, utilizza Scale.ScaleAll(Panel1, True)

Allora te la faccio breve.
Ho una prima schermata in cui gli oggetti sono già disegnati e lo SCALE funziona.
In una seconda mappa ho diversi oggetti ma tralasciando questi:
B4X:
Sub Activity_Create(FirstTime As Boolean)
    Scale.Initialize
    Scale.ScaleAll(Activity, True)
    ...
successivamente:
B4X:
    Activity.AddView(mostranellamappa,100%x-202dip,100%y-50dip,200dip,44dip)
    'Scale.ScaleView(mostranellamappa)

cosi ottengo la parte bot della schermata:
La label mostranellamappa non viene SCALATA (perchè?)

mappa1.jpg


se tolgo il commento su Scale.ScaleView(mostranellamappa) ottengo una cosa strana:

mappa2.jpg


Forse sbaglio io qualcosa...
GRAZIE
 

LucaMs

Expert
Licensed User
Longtime User
Non sono certo di avere capito bene.

Hai una prima Activity (Main?) in cui carichi tutto con il LoadLayout, poi scrivi le due righe di codice e tutto è ok?

Poi hai una seconda activity? Se è così, in questa seconda e nelle altre, non devi reinizializzare il modulo (niente Scale.Initizialize) ma devi utilizzare Scale.ScaleAll(Activity, True) (sempre dopo un eventuale caricamento di un layout, se esiste).
Dopodiché:
Activity.AddView(mostranellamappa,100%x-202dip,100%y-50dip,200dip,44dip)
Scale.ScaleView(mostranellamappa)
dovrebbe funzionare.

Oh, una cosa: tutto questo vale se quando disegni nel Designer, il variant è impostato su 320x480-1.
Se fosse diverso, ad esempio 600x960-1, allora invece di inizializzare con: Scale.Inizialize, devi utilizzare: Scale.SetReferenceLayout(600, 960, 1), ovvero prende come base di partenza, come riferimento, quelle dimensioni di schermo.
 

dibesw

Active Member
Licensed User
Longtime User
Luca, innanzi tutto grazie per le risposte;

Ti chiedo subito una cosa (e da questa potrebbe dipendere tutto quello che viene dopo):
ma il Layout Variant deve essere uno solo, oppure bisogna prevederli tutti (ovvero 240x320, 320x480, 600x960 ecc......)?

Allora, io ho un Layout Variant impostato a 800x1280 (ho un tablet Samsung).
Ho 2 Activity: la prima con oggetti già disegnati, la seconda con oggetti da aggiungere (AddView)
Fin qui tutto bene (sul tablet).

Come mi hai consigliato tu ho aggiunto
B4X:
'Scale.Initialize
Scale.SetReferenceLayout(800, 1280, 1.18)
Scale.ScaleAll(Activity, True)
...
...
Activity.LoadLayout("menu")
e faccio questo alla prima Activity (come vedi la prima Activity alla fine chiama la maschera menu)
A questo punto ti chiedo una cosa.
Ho creato 2 Virtual Device, una a 800x1280 ed un'altra a 240x320 (per provarlo su un vecchio telefono).
Se imposto il Virtual device a 240x320 (è giusto fare questo per provare se fa lo SCALE?)
già la prima maschera (menu, che ha oggetti disegnati) non vengono scalati!
 

LucaMs

Expert
Licensed User
Longtime User
Il LoadLayout devi metterlo come prima istruzione; poi, se aggiungi subito altre view, queste righe vanno subito dopo. Infine la coppia di Scale.
Se hai progettato il layout nel designer con 800-1280-1.18, come penso di aver capito, le istruzioni che hai scritto vanno bene, ma devono seguire il LoadLayout.

Nella seconda activity, dipende da quali valori metti: se li metti in percentuali di x e y, poi non devi utilizzare lo scale, altrimenti si.
 

lock255

Well-Known Member
Licensed User
Longtime User
@lucas, lavorando con l'oggetto AdView non sono riuscito a scalarlo. Forse perchè non esiste il componete per nel designer?
 

LucaMs

Expert
Licensed User
Longtime User
Non conosco quell'oggetto.

Il modulo Scale cerca nel layout tutte le view conosciute e le scala. Se quella non è nel suo "dizionario", non agisce.

Però puoi utilizzare le altre funzioni del modulo. Ad esempio, scale.GetScaleX e scale.GetScaleY:

MioOggetto.Left = 100dip * scale.GetScaleX
 

lock255

Well-Known Member
Licensed User
Longtime User
Grazie alla tua dritta sembra che venga scalato anche quello, anche se non posso testarlo correttamente dato che l'emulatore non visualizza la pubblicità... ed ho un solo cellulare.
 
Top