Autore Topic: Manipolare sfondo Activity  (Letto 738 volte)

Offline Ilgard

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Xperia M
  • Sistema operativo:
    Ubuntu 14.04
Manipolare sfondo Activity
« il: 14 Ottobre 2014, 11:55:14 CEST »
0
Salve a tutti, sto usando un FragmentActivity con un DrawerLayout ed in funzione della sezione necessito di cambiare lo sfondo.
Spesso lo sfondo è un normale colore di riempimento e lì non ho problemi, però se voglio impostare un'immagine di sfondo non so come adattarla allo schermo (di default usa tutta l'immagine, quindi dovrei farne una per ogni tipo di schermo) e volevo sapere se c'è un modo per farlo.
Per ora sto usando il semplice setBackground con un Drawable ma, appunto, con scarsi risultati.
Alla fine io ho un logo da mettere come sfondo e quel logo lo posso inserire su uno sfondo bianco senza problemi. Quello che vorrei è poter avere il logo al centro dello sfondo senza che venga allungato, contratto o quant'altro.
Si può fare?

Online Ohmnibus

  • Utente senior
  • ****
  • Post: 586
  • Respect: +132
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Manipolare sfondo Activity
« Risposta #1 il: 14 Ottobre 2014, 12:45:39 CEST »
0
Prova creando due "alias" del tuo drawable.
Chiamali tutti e due con lo stesso nome (es. alias_sfondo.xml) e sostituisci a "tuoDrawable" il nome del drawable che stai attualmente usando.
Uno lo crei nella cartella "drawable":

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
   android:gravity="fill_horizontal"
   android:src="@drawable/tuoDrawable" />

L'altro lo metti in "drawable-land":

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
   android:gravity="fill_vertical"
   android:src="@drawable/tuoDrawable" />

A questo punto usa @drawable/alias_sfondo al posto del drawable che stai usando.
Android sceglierà automaticamente uno o l'altro alias. Il primo verrà usato per gli schermi in verticale, e ridimensiona il drawable originale in modo da prendere tutta la larghezza (che è la dimensione minore, quindi non taglia via parti dell'immagine); il secondo verrà usato per gli schermi in orizzontale, e ridimensiona il drawable fino ad occupare tutta l'altezza.
In questo modo la tua immagine occuperà tutto lo spazio disponibile senza tuttavia essere deformata o tagliata.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Ilgard

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Xperia M
  • Sistema operativo:
    Ubuntu 14.04
Re:Manipolare sfondo Activity
« Risposta #2 il: 14 Ottobre 2014, 16:34:07 CEST »
0
Ho provato ma ricevo questo errore:
Codice: [Seleziona]
10-14 10:14:13.095: E/AndroidRuntime(1109): java.lang.OutOfMemoryError
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:422)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:445)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:475)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.graphics.drawable.BitmapDrawable.inflate(BitmapDrawable.java:569)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.content.res.Resources.loadDrawable(Resources.java:2092)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.content.res.Resources.getDrawable(Resources.java:700)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at com.solinas.piero.sinistrastudentescauniversitaria.MainFragment.onCreateView(MainFragment.java:143)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.app.Fragment.performCreateView(Fragment.java:1700)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.app.BackStackRecord.run(BackStackRecord.java:684)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.app.Activity.performStart(Activity.java:5240)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2168)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.app.ActivityThread.access$800(ActivityThread.java:135)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.os.Handler.dispatchMessage(Handler.java:102)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.os.Looper.loop(Looper.java:136)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at android.app.ActivityThread.main(ActivityThread.java:5017)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at java.lang.reflect.Method.invokeNative(Native Method)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at java.lang.reflect.Method.invoke(Method.java:515)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
10-14 10:14:13.095: E/AndroidRuntime(1109):         at dalvik.system.NativeStart.main(Native Method)
quando chiamo la
Codice (Java): [Seleziona]
container.setBackground(getResources().getDrawable(R.drawable.alias_sfondo));

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Manipolare sfondo Activity
« Risposta #3 il: 14 Ottobre 2014, 16:59:56 CEST »
0
Immagine di sfondo troppo grande, non come kbytes, ma come larghezza x altezza.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Ilgard

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Xperia M
  • Sistema operativo:
    Ubuntu 14.04
Re:Manipolare sfondo Activity
« Risposta #4 il: 14 Ottobre 2014, 17:32:18 CEST »
0
Beh, ma non mi cambia praticamente nulla: l'immagine viene stretchata.
Io invece preferirei che venisse ritagliata visto che comunque è un logo su sfondo bianco e dello sfondo non mi frega nulla.
Per caso devo creare l'immagine con determinati rapporti larghezza/altezza?
« Ultima modifica: 14 Ottobre 2014, 17:45:38 CEST da Ilgard »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Manipolare sfondo Activity
« Risposta #5 il: 14 Ottobre 2014, 18:21:16 CEST »
0
Per caso devo creare l'immagine con determinati rapporti larghezza/altezza?

Per l'errore devi farla più piccola. Se (ad esempio) 2048x1600 fa andare in crash, prova con 512x200 e poi sali per vedere fino a quanto regge. Tieni conto che quando una bitmap fa andare in crash un'app, è perchè ha esaurito tutto lo spazio di memoria (heap) dell'app.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Ilgard

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Xperia M
  • Sistema operativo:
    Ubuntu 14.04
Re:Manipolare sfondo Activity
« Risposta #6 il: 15 Ottobre 2014, 11:45:17 CEST »
0
Il problema delle dimensioni l'ho risolto, ma continuo a non riuscire ad avere un risultato accettabile dal punto di vista estetico: l'immagine mi viene sempre stretchata risultato sgradevole.
C'è un modo per avere uno sfondo bianco ed una immagine al centro?
Ad esempio, in Java modificherei la paint di un JPanel impostando il colore di sfondo a bianco e poi disegnando al centro la sola immagine con il logo. In questo modo avrei il logo sempre con le giuste proporzioni senza tanti casini di immagini.
Perché fin'ora ho provato con immagini quadrate e rettangolari (sia più lunghe che larghe, sia il contrario) e finisce che o in modalità landscape, o in modalità portrait, ho il logo palesemente stirato.
E, tra l'altro, non ho nessuna garanzia di qualità su come si veda in schermi diversi da quello del mio telefono.
Invece io ho bisogno di poter centrare una immagine al centro dello schermo e lasciare il resto bianco.
Ad esempio, potrei farlo tramite ImageView e poi inserire sopra di questa due bottoni (che tanto è quello che serve a me)?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Manipolare sfondo Activity
« Risposta #7 il: 15 Ottobre 2014, 12:19:32 CEST »
0
Il problema delle dimensioni l'ho risolto, ma continuo a non riuscire ad avere un risultato accettabile dal punto di vista estetico: l'immagine mi viene sempre stretchata risultato sgradevole.
C'è un modo per avere uno sfondo bianco ed una immagine al centro?
Ad esempio, in Java modificherei la paint di un JPanel impostando il colore di sfondo a bianco e poi disegnando al centro la sola immagine con il logo. In questo modo avrei il logo sempre con le giuste proporzioni senza tanti casini di immagini.
Perché fin'ora ho provato con immagini quadrate e rettangolari (sia più lunghe che larghe, sia il contrario) e finisce che o in modalità landscape, o in modalità portrait, ho il logo palesemente stirato.
E, tra l'altro, non ho nessuna garanzia di qualità su come si veda in schermi diversi da quello del mio telefono.
Invece io ho bisogno di poter centrare una immagine al centro dello schermo e lasciare il resto bianco.
Ad esempio, potrei farlo tramite ImageView e poi inserire sopra di questa due bottoni (che tanto è quello che serve a me)?

Prova uno dei modi in questo tutorial che avevo scritto 3 anni fa. Non so se si applicano esattamente al tuo caso, ma quanto meno l'argomento dovrebbe essere il solito.

[facile] Gestione di bitmap come background di Activity - Android Developers Italia
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Online Ohmnibus

  • Utente senior
  • ****
  • Post: 586
  • Respect: +132
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Manipolare sfondo Activity
« Risposta #8 il: 15 Ottobre 2014, 12:50:59 CEST »
0
In alternativa:
Imposta lo sfondo del container bianco.
Metti la seguente ImageView sotto alle altre viste:
Codice (XML): [Seleziona]
<ImageView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#fff"
        android:scaleType="fitCenter"
        android:src="@drawable/tuoLogo" />
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Ilgard

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Xperia M
  • Sistema operativo:
    Ubuntu 14.04
Re:Manipolare sfondo Activity
« Risposta #9 il: 15 Ottobre 2014, 16:14:25 CEST »
0
Leggendo un po' il link con la guida mi sono resto conto che la soluzione era molto più semplice: mi era stato consigliato, nell'alias, di impostare la proprietà gravity con fill_vertical e fill_horizontal. Invece bastava semplicemente mettere center ed il logo viene centrato.