Italian a proposito di scale...

dibesw

Active Member
Licensed User
Longtime User
Ciao a tutti.
Vi risulta che ci possano essere delle differenze tra quello che visualizzo su AVD (cioè l'emulatore di device) e quello che vedo effettivamente sul device?
Premetto che ho installato l'ultima versione di AVD (22.6.4) e utilizzo
Scale.ScaleAll che funziona bene sui device a bassa risoluzione;
il riferimento iniziale è: Scale.SetReferenceLayout(600, 960, 1)

Vi faccio presente il mio caso:
su AVD che simula nexus 5 (1080x1920) vedo questo...



TUTTO PERFETTO.
Se installo l'apk su Samsung S4 (che ha le stesse caratteristiche di Nexus 5!!) vedo questo...



cioè completamente diverso da quello che si vede sull'emulatore; è tutto più grande (notare la parola in alto a dx "Recensioni" che viene tagliata a "Recension".

Qualcuno mi può spiegare che può essere?
Probabilmente sbaglio da qualche parte, ma può essere che la routine "Scale" non funzioni correttamente per questa risoluzione (1080x1920).
Grazie in anticipo.!
 

LucaMs

Expert
Licensed User
Longtime User
Ciao.

E' sempre un rompicapo, la grafica.

La cosa strana è che non ti "quadri" sul dispositivo reale; sarebbe più normale che non funzionasse bene sugli emulatori.

Hai scritto che "funziona bene sui device a bassa risoluzione": è corretto o intendevi sugli emulatori a bassa risoluzione?

Comunque, mi vengono in mente alcuni tentativi che puoi fare:

1) verificare di avere la stessa versione di S.O. sul "nexus" e sul S4 (prova anche a confrontare, in percentuale, la dimensione del Title con l'altezza dei display; a occhio mi sembrano diverse);

2) prova ad utilizzare alcuni log per verificare varie dimensioni (ovviamente, sia nel caso dell'emulatore che col dispositivo reale):
in particolare, metterei un log("DeviceScale = " & DeviceScale) nella Initialize del modulo Scale, subito dopo il calcolo del DeviceScale, e Log("cScaleX = " cScaleX) prima della Sub End
 

dibesw

Active Member
Licensed User
Longtime User
Si, in effetti il test l'ho effettuato sul samsung s4 e sull'emulatore funziona bene.
La cosa strana e' che se rimango in bassa risoluzione (480x800 fino ai samsung tab 3) va tutto bene e quello che vedo su emulatore e' identico al device effettivo!
Ho provato il samsung s4 (su AVD quello che si avvicina di piu' e' appunto il Nexus 5) lo scale non funziona piu', ovvero su emulatore funziona mentre sul device il risultato e' diverso.
Questa cosa mi fa pensare, dato il grande quantitativo di telefoni in circolazione, che il comportamento non e' lo stesso e quindi l'emulatore non e' affidabile.
A proposito di DeviceScale mi puoi dire che cosa e' il SetRate impostato per default a 0.3?
Grazie
 

LucaMs

Expert
Licensed User
Longtime User
Sinceramente non ho idea dello scopo del Rate.
Nel codice, come puoi vedere, Rate viene utilizzato soltanto per i dispositivi di almeno 6 pollici e, dal mio punto di vista, questo non ha senso, perché se ingrandisco o rimpiccolisco una view, questa operazione dovrebbe essere automatica e proporzionata, senza necessità di "correzioni", come sembra fare quel Rate.

Tralasciamo gli emulatori, per il momento.

Sul tuo S4 dovrebbe funzionare, se hai impostato le giuste dimensioni e densità, come penso. Tra l'altro, io ho dato solo un'occhiata al volo, ma la mia app, su un S4, scalata nello stesso modo, si vede bene.

Oltre ai consigli che ti ho scritto precedentemente, ti suggerirei di fare i log di ogni "pannello"; se è come penso, quelli sono pannelli/record, nel senso che questo:


probabilmente è un pannello: verifica la larghezza originale e quella ottenuta con lo scaling. Va effettivamente oltre lo schermo? Non è che per caso sono invece sbagliate le dimensioni dei testi (TextSize)? Lo chiedo perché io ho modificato nel modulo Scale il modo in cui il testo viene ridimensionato.

Inoltre, potrebbe esserci un'altra "variabile" da prendere in considerazione. Per dare una mano ad un nostro "collega", provai a creare un righello sul display del mio smartphone: non c'era modo di ottenere 1cm preciso, per colpa delle caratteristiche dichiarate dal costruttore.

Comunque, dato che sono cocciuto, spendo un altro po' di tempo a studiare tutta la faccenda Scale, compreso il Rate. Ti anticipo che, per quanto riguarda le immagini, ho appena scoperto che sia LoadBitmapSample che la routine CreateScaledBitmap portano ad imperfezioni che invece non esistono scalando prima le immagini con qualche sw per PC, per cui, se possibile, evitare di usare quelle due funzioni e caricare immagini già scalate.
 

LucaMs

Expert
Licensed User
Longtime User
A proposito di quanto ho scritto per i TextSize, ho trovato questo post.


Guarda anche le caratteristiche del S4 in questa tabella di Wikipedia. C'è un doppio asterisco con una nota.

[P.S. c'era, nella pagina di wikipedia che io avevo scaricato; hanno modificato la pagina!]
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Forse proprio la densità dei pixel è il problema.

Nella tabella, per l'S4 è dichiarata 441.

Se si dovesse creare un variant, esso non dovrebbe essere:

Width: 1080
Height: 1920
Scale: 3

perché Scale 3 corrisponde a 160x3 = 480, non 441!
si dovrebbe impostare a 441/160 = 2.75625.

Immagino che si dovrebbe impostare SetRate a 441/480 = 0.91875, ma altri dispositivi hanno valori differenti!
Inoltre, quel Rate influisce solo su dispositivi di grandezza superiore o uguale ai 6", mentre l'S4 è 5".

Conclusione: un guazzabuglio
 

LucaMs

Expert
Licensed User
Longtime User
Per vedere se ho ragione (e quando mai!), fai una prova:

modifica il modulo Scale. Invece di:
B4X:
If GetDevicePhysicalSize < 6 Then

metti < 5. In questo modo, Rate avrà effetto anche sul S4.
Poi, SetRate(0.91875)

Solo per prova!
 

dibesw

Active Member
Licensed User
Longtime User
Complimento LucaMs, mi hai dato un sacco di informazioni;
grazie della tua disponibilità (è difficile trovare persone così).
Si, in effetti quello è un pannello al cui interno vengono posizionati (a runtime) vari oggetti (label, text, immagini).
Allora lo Scale.ScaleAll funziona abbastanza bene.
Io ho basato tutto su un samsung tab 3 a 8 pollici.
Quando tu dici
"Non è che per caso sono invece sbagliate le dimensioni dei testi"
intendi dire che il la lunghezza è maggiore dei caratteri che effettivamente compongono il testo stesso?
Se è così, questo non lo escludo e farò dei controlli.
Il problema principale è che, a questo punto, non è possibile fare un test serio;
il perchè è che, al di la di tutto, se ti affidi all'emulatore, non è sempre reale quello vedi e potrebbe non essere la stessa cosa sul device.
Quindi tutte le prove le devi fare direttamente sul device (in questo caso sull'S4 che io non ho) ed è una bella palla!
Comunque quello che ho capito è che la routine "Scale" non è proprio infallibile e quindi occorre capire i suoi limiti e dove sono i suoi bug.
Farò un po di prove e ti illustrerò i risultati.
GRAZIE
 

LucaMs

Expert
Licensed User
Longtime User
Di niente, ci si aiuta a vicenda; e in questo caso, non posso aiutarti molto, purtroppo.

Penso che gli emulatori abbiano la densità fissa, cioè a 160, 240, 320... mentre i dispositivi variano, vedi l'S4 con i suoi 441.

Pensavo che avessi l'S4, per questo ti consigliavo delle prove.

Non l'ho nemmeno io, ma ho qualcuno su cui fare dei test .

Proverò un variant come il tuo, scalarlo come hai fatto e ti faccio sapere.
 

dibesw

Active Member
Licensed User
Longtime User
...volevo dirti che
nella Initialize di Scale l'istruzione
B4X:
If GetDevicePhysicalSize < 6 Then
non verrà mai eseguita, ma verrà eseguita sempre
B4X:
    If cRefHeight <> 480 OR cRefWidth <> 320 OR cRefScale <> 1 Then
        If 100%x > 100%y Then
            ' landscape
            cScaleX = 100%x / cRefHeight / cRefScale / DeviceScale
            cScaleY = 100%y / (cRefWidth - 50 * cRefScale) / DeviceScale
        Else
            ' portrait
            cScaleX = 100%x / cRefWidth / cRefScale / DeviceScale
            cScaleY = 100%y / (cRefHeight - 50dip * cRefScale) / DeviceScale
        End If
    Else
in quanto i riferimenti che ho introdotto io sono 900x960x1
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Scusate se mi intrometto, ma ho un problema sugli Scale riguardanti la grafica.
L'Autoscale, non fa una piega sugli oggetti creati da Design... ma come faccio a ridimensionare in maniera uguale, anche quelli creati da codice?
Ho delle immagini che creo e, mentre sul mio smarth si vedono bene (seppur settati con una risoluzione minore (480x320 scale 1 (160dpi))... mentre sull'emulatore di un Tab 7", queste, sono piccole e hanno spazi fra loro!
Logicamente, il testo rimane piccolo (ma per quello è un'altra cosa).
Mi andrebbe bene anche sapere qual'è il metodo di scale del dispositivo su cui viene lanciato, per poi aggiungerlo in %....sarà DeviceScale?
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Proprio per questo esiste il modulo Scale, è l'unico col quale puoi ridimensionare views aggiunte da codice.

Puoi utilizzare la sua routine Scale.ScaleView.

Però ti dico di alcune prove che ho fatto, che non riguardano il modulo, magari sarà utile a te ed altri che non se ne siano già accorti.

Io pensavo che partendo da immagini grandi e utilizzando poi LoadBitmapSample nei casi in cui mi fossero servite più piccole, non avrei avuto problemi.
Invece, sia utilizzando LoadBitmapSample che la routine sul sito CreateScaledBitmap, le immagini non hanno una buona qualità.
Partendo dalla stessa immagine grande ma ridimensionandola con strumenti esterni (ho usato Paint Net) il risultato è nettamente migliore.

Questo è un esempio, non il più eclatante. Partendo da una immagine 512x512 e riducendola a 64x64:


il cerchio interno...!

In altri casi è anche peggio.
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Fammi capire meglio.
Io utilizzo lo Scale.ScaleAll(Acticity,true) subito dopo il caricamente del Layout di questa, per ridimensionare tutte le immagini cpresenti sul Design (che hanno il loro componente present).
Poi, all'interno del codice, creo delle immagini con array, con la .Addview. Debbo mettere lo Scale.ScaleView di tutte le immagini? Sempre prima di tutto (dopo l'Activity)?
Ho provato a metteren uno sull'evento Click (dove creavo una immagine)... ma non ha cambiato nulla.
PS: Voglio fare cose grandi... e poi mi perdo in cose piccole.
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Gasp!
Ho provato a lanciare il mio gioco sul dispositivo AVD_for_3.2_QVGA_ADP2, ma dopo aver scelto il livello (quindi al caricamento del gioco vero e proprio), mi da solo una shermata nera e, in debug, non vedo nessun Log
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Ecco, invece, come appare sul mio Smart e come su di un tablet 7"

Mio



Tablet 7"


Nel Tablet 7" (dell'emulatore), si vedono gli oggetti più piccoli (lettere e nmero livello) e i caratteri minuscoli.
Logicamente, anche la ListView e più corda, non essendo ridimensionata.
...Sul dispositivo dell'emulatore detto sopra (AVD_...) questa, non lo vede proprio...completamente nero e senza log.
 
Last edited:

klaus

Expert
Licensed User
Longtime User
As already asked for in the English forum.
Could you post your project as a zip file or at least a smaller project showing the problem.

A proposito di DeviceScale mi puoi dire che cosa e' il SetRate impostato per default a 0.3?
SetRate(1) is exactly the same as %x and %y scaling !
SetRate allows you to increase the scale of the views less than 1.
In some cases you don't want to scale the views propotionally to the screen ratios, that's what the ScaleRate does.
For small screens, less than 6'', for me scaling with a ScaleRate less than one is not realistic, but for bigger screens it makes sense.
For me, having a same layout for a 3.5'' screen scaled up proprtionally for a 10'' screen will not look very good.
Did you have a look at the relevant chapters in the Beginner's Guide ?

With the Scale module, if you want to display images you should use ImgeViews to display them and not Panels. ImageViews keep the Width/Height ratio.

If you have views added in the Designer and views added in the code you should call Scale.ScaleAll(Acticity, True) after having added the views in the code, not before.

But, if you could post a small project with your layout, I'll have a look at it.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Mi sembra di aver capito che hai alcune imageview inserite tramite designer, altre tramite codice.
Quindi, dopo aver caricato il layout, utilizzi Scale.ScaleAll e, si, per ogni imageview aggiunta successivamente (o per qualunque altro tipo di view), devi utilizzare Scale.ScaleView.
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Ho inserito lo scaleView ma non sucede nulla... dove sbaglio?


B4X:
Sub masklivello(i As Int)
Dim MaxLivello As Int
Select Case i
Case 1
    For k=0 To MaxLivello
        UpBox(k).Initialize("UpBox")
        UpBox(k).Tag=k
'scale
        Scale.ScaleView(UpBox(k))
''''''''''     
        If k<4 Then
            UpBox(k).Bitmap=LoadBitmap(File.DirAssets,"LX.png")
            Panel1.AddView(UpBox(k),2%x+Panel1.Left+8%x*k,(Panel1.Height/2)+22%y,7%x,12%y)
            TipoImg(k)="LX.png"
        Else
            UpBox(k).Bitmap=LoadBitmap(File.DirAssets,"L0.png")
            TipoImg(k)="L0.png"
            Panel1.AddView(UpBox(k),2%x+Panel1.Left+8%x*k,(Panel1.Height/2)+22%y,7%x,12%y)
        End If
    Next
....
....
....
End Select

End Sub
 
Last edited:
Cookies are required to use this site. You must accept them to continue using the site. Learn more…