Italian a proposito di scale...

LucaMs

Expert
Licensed User
Longtime User
Se l'errore è che proprio non vedi nulla, non lo so, dalle poche info che ho. Però, a occhio, immagino che tu abbia messo anche ScaleAll, tramite il quale tu hai già scalato Panel1, nel quale aggiungi quelle UpBox con delle dimensioni relative al pannello stesso, quindi non devi scalarle.
Se non vedi nemmeno Panel1, coloralo e usa un log all'interno del ciclo che ti faccia vedere quali siano le dimensioni e posizione del pannello.

[adoro i giochi di parole... la scaricherò di sicuro ]
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Posto una piccolissima parte del programma con pochi oggetti (perché è pesante parecchio ) proprio di questo modulo, come consigliato da Klaus, per testarlo personalmente e, magari, trovare il problema.
Ho delle imageview create da codice (lbox vuoti e lettera "A", una listview e un testo.
Posto il codice con le immagini.
PS: E' fatto con B4A 3.8... comunque, lo metterò a pagamento (quando lo finirò ). Ma è possibile che ne faccia una versione DEMO ma limitatissima

https://www.dropbox.com/s/im54psfw62qd3bm/xSample.rar
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Beh, lo testerà Klaus, io ho ancora la 3.20 di b4a.

Cmq, riguardando le immagini del post #17 si vede un problema, molto evidente nel "timer": il cerchio diventa ovale, le immagini sono schiacciate.

Il punto è, e se posso dirlo è un po' un casino!, che quello che chiamano ratio, cioè il rapporto tra larghezza e altezza (o viceversa, non è importante) non è lo stesso su ogni display. Quindi, noi vorremmo ottenere semplicemente una specie di zoom, avanti o indietro, ma questo non è possibile, a meno di non lasciare spazi vuoti a destra e sinistra oppure in alto e in basso.

E' complicato, cerco di spiegarmi meglio.

Facciamo il caso di una unica immagine da mettere a tutto schermo (il discorso poi diventa uguale per tutta la nostra videata piena di views).
Il mio smartphone ha dimensioni WxH 480x800. Per puro caso trovo un'immagine proprio di 480x800; ovviamente è perfetta per il full screen sul mio dispositivo.

Ora voglio scalarla su un dispositivo 400x600; non potrò mai avere il full screen con tutta l'immagine se non distorta, perché 480/800 = 0.6 mentre 400x600 = 0.66....

Quindi, o metto l'immagine a full screen ma distorta, oppure mantengo le giuste proporzioni ma mettendo l'immagine più piccola, quindi lasciando spazi sopra o sotto, questo dipende appunto dal ratio, se è superiore o inferiore a quello dell'immagine.
 

LucaMs

Expert
Licensed User
Longtime User
Ecco, mi è venuto in mente un esempio molto più immediato: i nostri televisori 16:9 quando vengono tramesse immagini ancora a 4:3 (come fa ancora la RAI con i TG, dopo anni che esiste il digitale!).

A quel punto le vediamo schiacciate (personalmente zoommo (bleah) ma ho parte delle immagini fuori schermo) ma potrei impostare il 4:3 ed avere barre nere ai lati
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Questa infatti è una cosa che ho notato con lo Scale, sul mio "Pensieri D'Amore". Purtroppo, su diversi dispositivi, le immagini sono schiacciate per quello che hai appena detto.
Inquesto caso, come dici, potrei mantenere le proporzioni lasciando spazi ma poi, come hai detto, poi diventa una casino.
Beh!, scomunque, su questo, si può anche fare.
...a questo punto, se non riesco a risolvere da codice, quasi quasi, creo n immagini sul design e finisco di impazzire
Posso, altrimenti, creare una sola immagine (tipo UpBox) e poi, da codice, copiarne altre (trasformandole in array? Se si, mantengo lo ScaleAll?
 

LucaMs

Expert
Licensed User
Longtime User
Creare una ImageView nel designer e replicarla in un array? Tanto vale crearla nel codice.
Eppure mi pare che per le ImageView il modulo di Klaus (lo nomino, così si fa vivo ) conservino il loro ratio.

Per lo ScaleAll (che comunque non risolve il problema detto prima) va utilizzato solo una volta, dopo il caricamento del layout. Se poi aggiungi view da codice, le scali con ScaleView. Il procedimento è sempre questo
 

klaus

Expert
Licensed User
Longtime User
I had a look at your project and before investigating deeper I have already some questions.
1) What do you expect from the Scale module ?
2) You are dimensioning all views with %x and %y values, so you don't need any scaling, only if you have texts.
Example :
Clock.Height=27%y
Clock.Width=18%x

But the timerclock.png image is a square image !?
You should use either
Clock.Height=27%y
Clock.Width=27%y

or
Clock.Height=18%x
Clock.Width=18%x

this will assure that the image remains square !
3) For the images you are using %x for width and %y for height, why ? This will for sure change the width/height ratio and distort the images !
4) The las.png image has a width of 55 pixels and a height of 58 pixels, do you want to maintain exactly the width/height ratio ?
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Ciao Klaus e grazie per la risposta.
Hi, Klaus and hanks you for your reply.

1) Hei Klaus, non sto dicendo nulla contro il modulo scale, anzi è utilissimo... Sono solo io che non so utilizzarlo al meglio . Mi aspetto che le immagini siano ridimensionate automaticamente per i vari device ed infatti, per quelle caricate da Design, funziona bene;
1) Hey Klaus, I'm not saying anything against the module scales, it is very useful ... I'm just not sure that I use it .Well , I expect that the images are automatically resized for different device and in fact, for those loaded by design, it works well;

2) Essendo il Layout in Landscape, e setto e percentuali x% e y% allo stesso modo, l'immagine viene distorta. Prova a modificare e a lanciarlo.
2) The Layout is in Landscape, and if I setting x% and y% in the same way, the image is distorted. Try to change and to launch it.

3) Come sopra. Mi baso su come appare nel mio dispositivo. Se setto uguale, distorce.
3) Some pt.2. I look in my device. If I setting the some value %, it's distorts.

4) Si, l'immagine las.png, è giusto che sia allungata e che abbia un rapporto di 55x58.
4) Yes, the image las.png, it should be stretched and has a 55x58.

...ma l'immagine dell'orologio è presente nel Design e lo Scale funziona senza problemi... è l'immagine che creo da codice (las.png) che io non riesco ad usare lo scale e, quindi, non si ridimensiona.
...but the Clock image is into Design and the Scale have not problem... is into imageview when I create with code (las.png) where I can not use the Scale and, therefore, does not resize.


Perché, se eseguo in 7" la lettera las,png non si scala? Dove sbaglio?
Why, I start into emulator Tab 7", the image las.png not scale? What is my error?
Grazie
Thanks
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
L'immagine 55x58, utilizzando Scale, dovrebbe rimanere con le stesse proporzioni, 55:58, ingrandita o (come si dice???) rimpiccolita ma sempre con quel rapporto.

Dato che non posso caricare il tuo progetto, puoi scrivere quali sono le dimensioni del variant di partenza? Quali quelle dell'emulatore di 7" e le dimensioni che ti vengono(in esecuzione) della tua png?
 

LucaMs

Expert
Licensed User
Longtime User
Ah, ecco, ho trovato:
B4X:
        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)

Tu utilizzi le percentuali quando aggiungi la UpBox(k) al pannello, quindi lo scale fatto prima non conta, le dimensioni verranno calcolate nella Panel1.AddView.

in AddView, per W e H usa:
55 * scale.GetScaleX, 58 * scale.GetScaleY
togliendo Scale.ScaleView(UpBox(k))
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
No, aspetta, credo sia sbagliato.

O meglio, è giusto ma poi ti viene schiacciata.

Devi calcolare il minimo tra Scale.GetScaleX e Scale.GetScaleY e usare quel minimo nel prodotto.

tipo:

MinScale = Min(Scale.GetScaleX, Scale.GetScaleY)
Panel1.AddView(UpBox(k), 2%x+Panel1.Left+8%x*k, (Panel1.Height/2)+22%y, 55 * MinScale, 58 * MinScale)
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Già Luca... era quello che avevo provato a fare ma, se loggo, ho valori di ritorno pari a 0 sia in cScaleX che in cScaleY ...avrò forse saltato qualcosa? E' strana questa cosa, ma ho 0 come ritorno.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Non è possibile

Non è che hai usato una variabile intera?

dim ScX as int = Scale.GetScaleX?

dim MinScale as Float = Min(Scale.GetScaleX, Scale.GetScaleY) ' funziona bene, ho provato, non col tuo sorgente, ovviamente.
 

Attachments

  • lm Imv Scaling.zip
    13.1 KB · Views: 225

LucaMs

Expert
Licensed User
Longtime User
Ma per forza: nel tuo codice non hai inizializzato il modulo Scale!

Hai messo soltanto:
Scale.ScaleAll(Activity,True)

devi usare prima:
Scale.Initialize

oppure, se come variant non hai usato il default 320x480-1, devi usare:
Scale.SetReferenceLayout ( con le impostazioni del variant)
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Gasp che sbadato!
Comunque, nulla. Continuano a visualizzarsi piccole... forse un poco più grandi, ma sempre con degli spazi enormi sia sopra che ai lati.
No, come variant ho usato 480x320 rate 1
Lo cScaleX, per l'emulatore 7", è solo 1.33, contro il Rate 1 del mio 4.5"
 

LucaMs

Expert
Licensed User
Longtime User
Ok, fai una cosa semplice semplice.

Non carico il tuo progetto, quindi è tosta.

Vedo che il panel1 è 100%x e 100%y. Tu parti da 320x480 e la tua immagine è 55x58
quindi, in percentuale, l'immagine è 55/320 = 17.1875% e 58/480 = 12.083%

caricale con:
Panel1.AddView(UpBox(k), 2%x+Panel1.Left+8%x*k, (Panel1.Height/2)+22%y, Panel1.Width * 55/320, Panel1.Height * 58/480)

(perché ho calcolato le percentuali se poi non le uso? hehehe)
 

klaus

Expert
Licensed User
Longtime User
You Dim Rix and Rix2 in Globals.
Then you initialize them once in Activity_Create with an EventName but you don't use any event.
Then you initialize them once more in Activity_Create without an EventName without diming it ?
If these are supposed to be different views you need to dim them again!

I don't understand this code:
Panel1.AddView(UpBox(k),2%x+Panel1.Left+8%x*k,(Panel1.Height/2)+22%y, 7%x,12%y)
You add UpBox(k) onto Panel1, so why depends the Left property on Panel1.Left ?
When you add a view to a Panel the reference point for the Left and Top properties is the upper left corner of the Panel not the upper left corner of the Activity.
It works in your case because Panel1.Left = 0 !

In this code:
B4X:
DnBox(k).Bitmap=LoadBitmap(File.DirAssets,"L" & Parolando(k) & "s.png")
DnBox(k).RemoveView
Panel1.AddView(DnBox(k),2%x+Panel1.Left+8%x*k,(Panel1.Height/2)+36%y,7%x,12%y)
DnBox(k).BringToFront
Why do you remove the view and add it again ?

In Sub OkStart_Click
this line looks strange to me:
SV.Panel.AddView(Rix,1%x,1%y*NumberOfRows,20%x,5%y)
are you sure that the Top property is only 1%y*NumberOfRows ?

and this one too:
SV.Panel.Height=SV.Panel.Height+35
why pure 35 pixels and not a %y value ?

The problem with the ImageViews added in the code was the missing imv.Gravity = Gravity.FILL

You should remove the OKStart button from the background image and use real button not using the background image because of the width/height ratios.

You don't need the Scale module, I removed all calls.

Attached you find a modified version.
 

Attachments

  • Parolando_New.zip
    145.8 KB · Views: 212
Last edited:
Cookies are required to use this site. You must accept them to continue using the site. Learn more…