Italian per il resize delle view

LordZenzo

Well-Known Member
Licensed User
Longtime User
ipotesi
creare una mappa di tutte le view per poterne registrare la posizione originale e
salvare la map sul dispositivo o su un server
leggere la map e riposizionare le view

per cui nella map oltre alle posizioni dovrebbe esserci, il nome o altro per identificarle
e non so come prenderlo

B4X:
For Each v As View In Activity.GetAllViewsRecursive
        ViMap.Put("left",v.Left)
        .....
        ViMap.Put("nome",v. ???)
Next
 

udg

Expert
Licensed User
Longtime User
Potresti registrarlo nel v.tag, ad esempio. Può andare?
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
Potresti registrarlo nel v.tag, ad esempio. Può andare?

e riscrivere il tag di 170 view? no cercavo qualcosa di veloce per fare il resize e ho trovato questo sistema

B4X:
Sub Resize
    Dim X,Y As Float   
    x=(100%x/1600)
    y=(100%y/2420)
    For Each v As View In Activity.GetAllViewsRecursive
        v.Height=(v.Height*y)
        v.Width=(v.Width *x)
        v.Left=(v.Left *x)
        v.Top=(v.Top *y)       
    Next   
End Sub

e funziona, tranne che il testo nelle label non cambia di dimensione
 

udg

Expert
Licensed User
Longtime User
Non ho capito perché ti serviva il nome della view se dovevi applicare al volo lo stesso resize a tutte.
In realtà pensavo volessi memorizzare lo stato attuale (posizione/dimensione) di una view dopo aver consentito all'utente di spostarla o ridimensionarla per poi ripristinare tale ultimo stato alla successiva esecuzione del programma invece che ripartire dal layout di default. Ad ogni modo, bene che tua bia risolto.
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
in realtà volevo creare un sistema flessibile, anche per il futuro, e avere la possibilità di modificare le view senza dover far reinstallare la app, ma solo modificando un file sul server
la soluzione di sopra mi e' venuta per 'caso' :)
non so se l'ordine con cui vengono 'Eachate' resta sempre lo stesso, in tutti i dispositivi, ed in tutte le nuove versioni
 

LucaMs

Expert
Licensed User
Longtime User
Ho lottato un bel po' con queste cose, all'inizio; adesso preferisco fare in modo di adattare i layout usando solo gli Anchor e poco script.

Il tuo codice potrebbe avere dei problemi, quello con For Each V As View, ad esempio, se il layout contenesse delle custom view; queste non sono vere View.

non so se l'ordine con cui vengono 'Eachate' resta sempre lo stesso, in tutti i dispositivi, ed in tutte le nuove versioni
In tutti i dispositivi quasi certamente sì, nelle nuove versioni, ovvero se modifichi il layout, no.
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
tuo codice potrebbe avere dei problemi, quello con For Each V As View, ad esempio, se il layout contenesse delle custom view; queste non sono vere View.
be si possono evitare le custom, ma sei sicuro che non verrebero viste?
ovvero se modifichi il layout, no.
in tal caso però potrei usare un file diverso per ogni versione..... devo studiarmi bene la situazione.....
 

LucaMs

Expert
Licensed User
Longtime User
neanche il pannello di base? strano comportamento
in vb si ottiene tutto, e si conosce che tipo di view è, se label o image o altro
qui invece non si sa che tipo sia, e non si possono variare le proprietà specifiche

Anche con B4A puoi conoscere il tipo di "oggetto grafico" che trovi in un layout; però, se usi:
For Each V As View...
vengono considerate solo le View "vere" (o forse viene anche lanciato un errore) mentre le custom view non lo sono, non sono oggetti di tipo view, sono un pannello con dentro altre view e non ti viene restitituito automaticamente il pannello di base.

Se usassi:
B4X:
For i = 0 To Activity.NumberOfViews - 1
    Dim obj As Object = Activity.GetView(i)
    If obj Is View Then
        '...
    Else
        If GetType(obj) = "xxxxxxx" Then
        End If
    End If
Next

GetType ti restituisce il tipo di oggetto (una stringa) e, se è una custom view la quale mette a disposizione una proprietà come AsView per recuperarne il pannello di base, potresti usare questo pannello per le dimensioni.
Ma quale è la stringa restituita da GetType per le varie custom view? E se la custom view non fornisce il pannello di base?

Insomma, si può fare ma innanzitutto è complicato e poi la faccenda di adattare i layout a tutti i dispositivi in quel modo non funziona mai bene.

Si deve cercare di adattare i layout usando le Anchor e davvero poca roba negli script.
Usare due soli Variant (uno per il landscape e uno per il portrait, se l'app li prevede entrambi).
E... se il dispositivo è uno smartphone, usare un layout, se è un tablet, usarne uno differente (e scrivere codice differente nell'app).

Puoi anche provare ad adattare come vuoi tu (cioè in percentuale) impostando AutoScaleRate(1) nello script.


P.S. Un modo molto utile, secondo me, per vedere di aggiustare il layout usando le Anchor è quello di usare sempre un pannello come sfondo, come se fosse l'Activity, e "disegnare" su quello il layout, con le View agganciate (ancorate). Nel Designer stesso, modificando le dimensioni del pannello di base, vedi subito l'effetto (guarda questo video). Inoltre, puoi selezionare un "dispositivo" in alto a destra, dove vedi "Match Chosen Variant", sempre per vedere se il risultato finale sarà soddisfacente.
 
Last edited:
Top