Io credo che con la frammentazione di Android è fondamentale ragionare durante lo sviluppo il più possibile in termini di proporzioni percentuali, in questo modo l'app si adatterà sempre a qualsiasi dispositivo.
Ho sviluppato TapDroid per prendere confidenza con B4A, è stata in pratica la mia prima app, è propri scrivendo quella che ho capito l'importanza del concetto "adattabilità". Con la marea di display di diverse dimensioni e densità è fondamentale secondo il mio punto di vista.
Se usi il Designer, comincia a prendere confidenza con gli script.
Dim bmpPersonaggio as Bitmap
Dim vWidth,vHeight as Int
Dim imvPersonaggio as ImageView
'Carichiamo l'immagine del personaggio
bmpPersonaggio = LoadBitmap(File.DirAssets,"personaggio.png")
'Definiamo l'altezza del personaggio
vHeight = 25%y
'Proporzioniamo la larghezza
vWidth = vHeight *(bmpPersonaggio.Width/bmpPersonaggio.Height)
'Visualizziamo sul display il personaggio proporzionato alle coordinati xy che preferisci
Activity.addview(imvPersonaggio,x,y,vWidth,vHeight)
ciao
il mio dubbio é come ridefinire i parametri top e left . Per le dimensioni infatti ci vengono in aiuto %x %y ma per riposizionare l oggetto che si fa ?
grazie
Inviato dal mio GT-I9100 con Tapatalk 2
' Vuoi che il tuo personaggio sia orizzontalmente al centro dello schermo?
imvPersonaggio.Left = 50%x-(imvPersonaggio.Width/2)
' Vuoi che il tuo personaggio tocchi il fondo dello schermo?
imvPersonaggio.Top = 100%y-imvPersonaggio.Height
Label1.TextSize = AltezzaFont(20) '=10%y
Sub AltezzaFont(PercentualeAltezza As Float) As Int
Return PerYToCurrent(PercentualeAltezza/2)/Density '1 punto PercentualeAltezza equivale a 0.5%y
End Sub
Cerco di spiegarmi meglio.
Se scrivo : label1.left=20%x
Allora si adatta in automatico per ogni schermo.
Io invece non voglio calcolare manualmente questa percentuale ma voglio inserire graficamente la label nel designer non curandomi del valore del parametro left, che per esempio é 100.
E voglio scrivere una routine generica che mi scansioni l'activity e per ogni view l'adatti allo schermo.
Come dati ho : la risoluzione del designer, la risoluzione del dispositivo che esegue l'applicazione ed ho il parametro label1.left che il sistema mi restituisce.
Il punto è che mi aspetto che il sistema mi restituisca label1.left essere = 100 su ogni dispositivo, poi sarò io che con la formula label1.left/480 * 720 dove 480 è la ris. Del designer e 720 quella del dispositivo, mi adatterò la posizione, infatti dal calcolo esce che sul nuovo schermo la label dovrà avere left =150.
Invece il problema è che la label la inserisco tramite designer,il sistema mi restituisce 100 su un display 480 mentre restituisce 133 su un display 720.
Di fatto impedendomi di effetture il semplice calcolo label1.left/480*720 che non porterebbe come risultato 150.
In realtà il sistema tiene conto anche dei dpi ed infatti 320/240 =1.3.
Cè un modo per leggere i dpi dello schermo del dispositivo che esegue l'applicativo? Cosi da fare prima un rapporto fra dpi e poi fra le risoluzioni, quindi per esempio 240/ 320 (sono i dpi del s3) * label1.left/480+720?
Dim xleft, xtop, xwidth, xheight, lwidth, lheigh
lwidth = Activity.Width-lmar ' larghezza display
lheigh = Activity.Height-lmar ' altezza display
For i = 0 To pn.NumberOfViews-1
' calculate
xleft = pn.GetView(i).Left * lwidth / pn.Width
xtop = pn.GetView(i).Top * lheigh / pn.Height
xwidth = pn.GetView(i).Width * lwidth / pn.Width
xheight = pn.GetView(i).Height * lheigh / pn.Height
' setting object
pn.GetView(i).SetLayout(xleft,xtop,xwidth,xheight)
Next
End Sub
'Entrambe le Label sono state impostate nel Designer con 100 di Left
Label1.Text = Label1.Left 'Questo valore viene modificato dalla scala
Label2.text = Scala(Label1.Left) 'Questo è il valore originario impostato nel Designer
Sub Scala (valore As Int) As Int
Return valore/Density
End Sub
Per ivanomonti:
Mi sa che la routine che proponi non funziona per le view aggiunte dramite designer, ho provato e non mi funziona ,mentre va bene per quelle aggiunte da codice.
Per Dominex:
Sei un grande ! era proprio il comando Density che mi mancava .
Grazie
Sub ScalaLayOut (ac As Activity,pn As Panel) As Int
Dim xleft, xtop, xwidth, xheight, lwidth, lheigh
lwidth = ac.Width ' larghezza display
lheigh = ac.Height ' altezza display
For i = 0 To pn.NumberOfViews-1
' calculate
xleft = pn.GetView(i).Left /Density
xtop = pn.GetView(i).Top /Density
xwidth = pn.GetView(i).Width /Density
xheight = pn.GetView(i).Height /Density
' setting object
pn.GetView(i).SetLayout(xleft,xtop,xwidth,xheight)
Next
End Sub
Sub SettingLayoutPanel(ac As Activity,pn As Panel)
Dim xleft, xtop, xwidth, xheight, lwidth, lheigh
lwidth = ac.Width ' larghezza display
lheigh = ac.Height ' altezza display
For i = 0 To pn.NumberOfViews-1
' calculate
xleft = pn.GetView(i).Left * lwidth / pn.Width
xtop = pn.GetView(i).Top * lheigh / pn.Height
xwidth = pn.GetView(i).Width * lwidth / pn.Width
xheight = pn.GetView(i).Height * lheigh / pn.Height
' setting object
pn.GetView(i).SetLayout(xleft,xtop,xwidth,xheight)
Next
Sub SettingLayoutPanel(ac As Activity,pn As Panel)
Dim xleft, xtop, xwidth, xheight, lwidth, lheigh As Int
Dim ScaleX, ScaleY As Float
lwidth = ac.Width ' larghezza display
lheigh = ac.Height ' altezza display
ScaleX = lwidth / 320 / Density
ScaleY = lheigh / 430 / Density ' 480 - 2 * 25
For i = 0 To pn.NumberOfViews-1
' calculate
xleft = pn.GetView(i).Left * ScaleX
xtop = pn.GetView(i).Top * ScaleY
xwidth = pn.GetView(i).Width * ScaleX
xheight = pn.GetView(i).Height * ScaleY
' setting object
pn.GetView(i).SetLayout(xleft,xtop,xwidth,xheight)
Next
End Sub
Try this code:Best regards.B4X:Sub SettingLayoutPanel(ac As Activity,pn As Panel) Dim xleft, xtop, xwidth, xheight, lwidth, lheigh As Int Dim ScaleX, ScaleY As Float lwidth = ac.Width ' larghezza display lheigh = ac.Height ' altezza display ScaleX = lwidth / 320 / Density ScaleY = lheigh / 430 / Density ' 480 - 2 * 25 For i = 0 To pn.NumberOfViews-1 ' calculate xleft = pn.GetView(i).Left * ScaleX xtop = pn.GetView(i).Top * ScaleY xwidth = pn.GetView(i).Width * ScaleX xheight = pn.GetView(i).Height * ScaleY ' setting object pn.GetView(i).SetLayout(xleft,xtop,xwidth,xheight) Next End Sub
What's the problem ?
I forgot to mention that I set in the main code
Panel1.Width = 100%x
Panel1.Height = 100%y
In your layout file the Panel height is 480 but on the device the height is only 430 !
Attached my test program. Tested (only portrait) with
Emulator 320 * 480 * 160
Nexus One 480 * 800 * 240
Asus TF700 1920 * 1200 * 240
Best regards.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?