Italian Sfondo applicazione

gdelvecchio

Member
Licensed User
Longtime User
Ciao a tutti
è da parecchio che mi stò scornando con lo sfondo della mia applicazione.

L'applicazione è in fase di testing è finao a poco tempo fa ho sempre utilizzato una sfondo composta da un gradient di due colori impostato da designer.

Così non ho mai avuto problemi!

La grafica mi ha passato lo sfondo dell'applicazione e implementadolo da designer oppure da codice:

B4X:
Sub Activity_Create(FirstTime As Boolean)
Activity.SetBackgroundImage(LoadBitmap(File.DirAssets, "sfondo_bassa.jpg"))
End Sub

Mi ritorna sempre lo stesso errore:

B4X:
java.lang.OutOfMemoryError
   at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
   at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:623)
   at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:722)
   at anywheresoftware.b4a.objects.drawable.CanvasWrapper$BitmapWrapper.Initialize2(CanvasWrapper.java:498)
   at anywheresoftware.b4a.objects.drawable.CanvasWrapper$BitmapWrapper.Initialize(CanvasWrapper.java:491)
   at anywheresoftware.b4a.keywords.Common.LoadBitmap(Common.java:1028)
   at info_mobile.b4a.ins_lavori._activity_create(ins_lavori.java:307)
   at java.lang.reflect.Method.invokeNative(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:511)
   at anywheresoftware.b4a.BA.raiseEvent2(BA.java:167)
   at info_mobile.b4a.ins_lavori.afterFirstLayout(ins_lavori.java:85)
   at info_mobile.b4a.ins_lavori.access$100(ins_lavori.java:16)
   at info_mobile.b4a.ins_lavori$WaitForLayout.run(ins_lavori.java:72)
   at android.os.Handler.handleCallback(Handler.java:615)
   at android.os.Handler.dispatchMessage(Handler.java:92)
   at android.os.Looper.loop(Looper.java:137)
   at android.app.ActivityThread.main(ActivityThread.java:4898)
   at java.lang.reflect.Method.invokeNative(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:511)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
   at dalvik.system.NativeStart.main(Native Method)
** Activity (sel_func) Create, isFirst = true **

Quindi l'app si mangia troppa memoria caricando ogni volta lo sfondo e dopo java va in eccezione!!!!:BangHead:

Tenete conto che ho fatto abbassare la definizione dell'immagine al minimo e il file pesa 21K.

Ho provato anche con un BMP ma fa la stessa cosa.

Ma come mai??????

E' un bag di B4A oppure sono io che sbaglio ??????

Dove sbaglio ?????


Grazie a tutti per il vostro contributo
 

gdelvecchio

Member
Licensed User
Longtime User
Ciao Luigi

l'immagine è grande 21 K!

Adesso provo spostando il tutto sotto il first time!!

speriamo.....
 

gdelvecchio

Member
Licensed User
Longtime User
mettendo il tutto sotto il firsttime = true c'è il problema che la prima volta ti imposta lo sfondo dalla seconda in poi prende quello impostato dal designer.

se imposto l'immagine di sfondo da designer l'applicazine torna lo stesso errore!!
dopo un pò che la utilizzi va in OUT OF MEMORY! :BangHead:

Qualche idea ?
 

gdelvecchio

Member
Licensed User
Longtime User
No!

Basta Initialaize perchè la mia immagine e già dimensionata.

se la vuoi dimensionare o comunque l'immagine è grande si deve usare la InitialaizeSample.
 

gdelvecchio

Member
Licensed User
Longtime User
No

Prima che funzionasse la inizializzavo sempre nel create e con il FirstTime = True ma lo facevo in tutte le mie activity.
E quindi mangiavo memoria per ogni activity aperta (come un pirla... lo so!)
Dopo ho capito di inizializzare l'immagine solo nel main e la richiamo in tutte le activity.

Ecco perchè dichiarare l'immagine nel process global è così importante.

Dimmi se hai bisogno di un esempio

Ciao
 

arenaluigi

Well-Known Member
Licensed User
Longtime User
Dato che è un problema abbastanza frequente, mi piacerebbe inserire un tutorial nel mio forum e spiegare come risolvere il problema a chi si scontra con questo problema.

In pratica hai reso globale l'immagine.
Ciao
 

gdelvecchio

Member
Licensed User
Longtime User
Sì!!

Ecco un pò di codice:

Nel process global dell'activity Main:

B4X:
Sub Process_Globals
Dim sfondo As Bitmap
End Sub

Nell'activityCreate del Main:

B4X:
If FirstTime = True Then
   sfondo.Initialize(File.DirAssets, "sfondo_bassa.jpg")
End If

in tutte le altre activity nel create:

B4X:
   Activity.SetBackgroundImage(Main.sfondo)

In questo modo mangiamo memoria solo nell'activity Main e dopo siamo a posto.

Che ne pensi ? E' una buona soluzione ?

A me sembra funzionare egregiamente su galaxy s3!

Adesso lo provo sul NEXT
 

gdelvecchio

Member
Licensed User
Longtime User
Eh sì!

E' un pò come la classe Modulo in VB.NET.
Purtroppo mi sembra di vedere che in B4A non esiste.

Speriamo nelle prossime release!

Non lo potremmo segnalare?
 

luciano deri

Active Member
Licensed User
Longtime User
Salve, la domanda è vagamente pertinente all'argomento ma non ho trovato un post più adeguato: posso impostare il gradiente di sfondo da codice? Mi sembra che da codice riesco solo a cambiare un unico colore dell'activity tramite la proprietà .color. Grazie.
 
Top