Autore Topic: Posizionare dinamicamente un'ImageView  (Letto 3257 volte)

Offline tavy

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone
  • Sistema operativo:
    Ubuntu 10.04
Posizionare dinamicamente un'ImageView
« il: 17 Agosto 2010, 19:47:05 CEST »
0
Dopo aver cercato in rete sia in inglese che in italiano non ho trovato tante soluzioni valide.
Devo fare un giochino per esercitarmi e avevo in mente di fare un'immagine una volta clicata cambiare la posizione random.

Il problema è che l'imageview non ha un metodo tipo .setX e .setY, e neanche setPosition.
Ho trovato in rete setPadding, ma questo semplicemente setta un padding perciò rimane lo spazio invisibile, non è che sposta proprio l'imageview, ma mi sposta solo il drawable che ho messo. Un'altra alternativa sarebbe usare anche la GridView, ma prima di provare con quella volevo chiedervi se conoscete qualche soluzione proprio per spostare l'immagine settando i parametri x e y.
Grazie

Offline Daystrom

  • Utente junior
  • **
  • Post: 90
  • Respect: +13
    • Mostra profilo
    • Starfleet
  • Dispositivo Android:
    HTC Magic + HTC Desire HD + Nexus S
  • Play Store ID:
    Daystrom
  • Sistema operativo:
    WXP
Re:Posizionare dinamicamente un'ImageView
« Risposta #1 il: 17 Agosto 2010, 23:18:41 CEST »
0
Dopo aver cercato in rete sia in inglese che in italiano non ho trovato tante soluzioni valide.
Devo fare un giochino per esercitarmi e avevo in mente di fare un'immagine una volta clicata cambiare la posizione random.

Al momento non sono davanti al mio PC ma mi pare di ricordare che nelle API demo che trovi nell'SDK ci sono delle immagini in movimento... Prova a guardarci.

Offline ScarfaceIII

  • Utente junior
  • **
  • Post: 112
  • Respect: +13
    • raferalston12
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    GNU/Linux, Ubuntu 10.04 / Windows 7
Re:Posizionare dinamicamente un'ImageView
« Risposta #2 il: 18 Agosto 2010, 01:07:33 CEST »
0
ImageView eredita dalla classe padre "View" ed essa ha un metodo per fare esattamente quello che chiedi ;-) View | Android Developers
Per sapere bene di cosa si tratta e come usarlo, leggi nella descrizione della classe, alla sezione intitolata "Layout", circa all'inizio. Sono a conoscenza di questo metodo perché l'ho usato personalmente per il mio progetto: quello che facevo era muovere proprio un'ImageView all'interno di un LinearLayout a seconda di come si inclinava il telefono, basandomi sui segnali degli accelerometri. In base a questi segnali infatti calcolavo la posizione della pallina nello schermo e poi la settavo proprio con questo metodo.

Spero di essere stato utile, buon lavoro! :D

Offline tavy

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone
  • Sistema operativo:
    Ubuntu 10.04
Re:Posizionare dinamicamente un'ImageView
« Risposta #3 il: 18 Agosto 2010, 02:07:35 CEST »
0
Grazie ad entrambi! Guarderò sicuramente anche gli esempi!

Per quanto riguarda View.layout sposta l'immagine (solo una volta, non so perchè, nel senso che la prima volta che clico l'immagine si sposta poi non più) ma non proprio come voglio io, vi spiego io ho l'immagine che rappresenta un bottone clicando sopra si sposta, se imposto con layout mettiamo (100,0,0,0) l'immagine si sposta a sinistra di 100 px, ma lo spazio da 0 a 100 px a sinistra dell'immagine è clicabile. Quindi mi fa lo steso effetto che faceva il setPadding.

Prima avevo risolto in un modo poco elegante la situazione mettendo l'imageview dentro un frameview e applicavo il setPadding sul frameview in modo che lo spazio che generava l'evento onclick fosse solo lo spazio occupato da imageview cioè dal drawable 64x64.

Offline ScarfaceIII

  • Utente junior
  • **
  • Post: 112
  • Respect: +13
    • raferalston12
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    GNU/Linux, Ubuntu 10.04 / Windows 7
Re:Posizionare dinamicamente un'ImageView
« Risposta #4 il: 18 Agosto 2010, 02:37:00 CEST »
0
Guarda, mi trovi un po' impreparato in quanto ho messo nel cassetto il progetto da un mesetto e la parte in questione l'ho fatta da almeno 3 mesi.  Ad ogni modo ti posso dire che i valori che passo a layout(int,int,int,int) sono calcolati in modo relativo rispetto alle dimensioni dello schermo, cosa che ti consiglio di fare, per non ritrovarti con comportamenti strani. Ad ogni modo per il tuo problema del "clickabile" che rimane esteso rimango un po' perplesso.
Innanzitutto non avevo capito si trattasse di un bottone, dato che parlavi di ImageView: se fosse un bottone ti consiglio di usare ImageButton. Ad ogni modo sarebbero utili maggiori informazioni come ad esempio l'XML del layout e/o magari uno snippet del codice che usi per cambiare posizione.
Come ultima cosa, per quello che riguarda il "dopo la prima volta non funge più", ti posso dire che la mia immagine viene spostata ad ogni aggiornamento del valore degli accelerometri, dato che chiamo il metodo layout dentro "OnSensorChange" (credo si chiami così, spero la memoria non mi inganni), che è il metodo del listener ai sensori. Consiglio per tanto a te, se non lo hai già fatto, di inserire la chiamata a layout all'interno del listener del Button, in tal modo continuerà ad essere chiamato ad ogni pressione del tasto ;)

Offline ScarfaceIII

  • Utente junior
  • **
  • Post: 112
  • Respect: +13
    • raferalston12
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    GNU/Linux, Ubuntu 10.04 / Windows 7
Re:Posizionare dinamicamente un'ImageView
« Risposta #5 il: 18 Agosto 2010, 02:54:41 CEST »
0
Un edit sarebbe stato corretto, ma visto che è una specie di "risposta a me stesso" ho creduto meglio fare un nuovo post.

Ho riflettuto (circa un nanosecondo dopo aver postato) sui tuoi problemi e sulle soluzioni che ti ho proposto e ho concluso che:

- il problema che hai del "non funziona più dopo la prima volta" è che i quattro parametri di layout() creano un "rettangolo" i cui 4 vertici sono i 4 parametri. Praticamente la chiamata al metodo con parametri con valore "statico", posiziona l'immagine in modo assoluto sullo schermo, sei tu a doverti creare un metodo che calcola la posizione in modo relativo. Per farla breve: layout(100,0,0,0) posiziona l'angolo alto-sinistra l'immagine precisamente nel punto 100,0.
- gli ultimi due parametri devono contenere il valore di altezza e larghezza dell'immagine: 0,0 non vanno bene! potrebbe essere questa la causa del "padding aggiuntivo" che ti ritrovi, prova con getWidth() e la sua sorellina che restituisce l'altezza  :-P

fammi sapere se funziona! Domani mattina spulcio il mio codice e ti posto uno snippet se serve. ciau

Offline tavy

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone
  • Sistema operativo:
    Ubuntu 10.04
Re:Posizionare dinamicamente un'ImageView
« Risposta #6 il: 18 Agosto 2010, 11:16:11 CEST »
0
Ok adesso provo un pò e ti faccio sapere.
Non è che era un bottone ma è un ImageView che lo fatta clicabile, ma nell'immagine è disegnato un bottone. alla fine forse faccio prima con ImageButton.

Offline tavy

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone
  • Sistema operativo:
    Ubuntu 10.04
Re:Posizionare dinamicamente un'ImageView
« Risposta #7 il: 18 Agosto 2010, 11:58:39 CEST »
0
Perfetto adesso ho capito come funziona grazie!

Vi posto qui uno screenshot dell'applicazione, in questo caso il layout è settato a (140, 78, 140+64, 78 + 64)
64 è la dimensione dell'immagine, cosi è perfetto.



Adesso cè un'altra cosa che voglio chiedervi, la parte che ho evidenziato in rosso, che è la parte che io non uso nella mia applicazione in questo caso è alta 50px, questo vale per tutte le rissoluzioni o no? Io prendo le dimensioni dello schermo cosi:

Codice (Java): [Seleziona]
       
Display display = getWindowManager().getDefaultDisplay();
        final int width_d = display.getWidth();
        final int height_d = display.getHeight();

E dopo dall'altezza devo togliere quanto occupa quella parte sopra. Ho provato con Layout.getWidth e getHeight ma non mi ristituisce niente. Cè qualche altro metodo per sapere lo spazio effettivamente disponibile?

Grazie!

Offline ScarfaceIII

  • Utente junior
  • **
  • Post: 112
  • Respect: +13
    • raferalston12
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    GNU/Linux, Ubuntu 10.04 / Windows 7
Re:Posizionare dinamicamente un'ImageView
« Risposta #8 il: 18 Agosto 2010, 12:44:51 CEST »
+1
molto bene! son contento che ti funzioni  ;-)

Come ti ho già suggerito precedentemente, però, vorrei insistere sul fatto di non passare per parametro dei valori statici al metodo layout. Ad esempio per la tua immagine, grande 64x64 non mettere "valore+64" nella funzione, è poco leggibile e se un giorno volessi cambiare immagine con un'altra, sicuramente ti dimenticherai di aggiornare questo valore. Ti riporto l'esempio del mio codice; questo metodo viene invocato passandogli un vettore di due elementi che indicano l'inclinazione in avanti del telefono, in %, e l'inclinazione destra-sinistra del telefono, in %. Da questi due valori io calcolo la posizione dell'oggetto sullo schermo:
Codice (Java): [Seleziona]
private void feedbackLayout(int [] commands){

        float x = ((mWidth - mSphere.getWidth()) * commands[1]) / 100;
        float y = ((mHeight/2) - mSphere.getHeight()) - (commands[0] *((mHeight/2) - mSphere.getHeight())) / 100;

        mSphere.layout((int) x, (int) y, (int) (x + mSphere.getWidth()), (int) (y + mSphere.getHeight()));
        if(D) Log.v(TAG, "* FEEDBACK LAYOUT, X: " + x + "Y: "+ y + " *");
        }
Come puoi notare per le dimensioni della mia immagine, uso mSphere.getWith() e mSphere.getHeight(), non il valore numerico. Ti consiglio di fare la stessa cosa anche per la posizione stessa dell'immagine.

Per quanto riguarda le dimensioni del display io uso questo codice per estrarle e se non ricordo male queste dimensioni indicano solo l'area utilizzabile, esclusi quindi i "50 px" indicati da te.
Codice (Java): [Seleziona]
        mHeight = getApplicationContext().getResources().getDisplayMetrics().heightPixels;
        mWidth = getApplicationContext().getResources().getDisplayMetrics().widthPixels;

Se ti sono stato utile, ricorda il tastino col pollice in su!  :-P 8-) O:-)

ciao!
« Ultima modifica: 18 Agosto 2010, 12:51:51 CEST da ScarfaceIII »

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Posizionare dinamicamente un'ImageView
« Risposta #9 il: 18 Agosto 2010, 12:48:00 CEST »
0
Tra l'altro i 50px ci sono solo su mdpi, in terminali hdpi o ldpi il numero di pixel cambia (non a caso in genere si utilizza come unità di misura il dp e non il px).
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline tavy

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone
  • Sistema operativo:
    Ubuntu 10.04
Re:Posizionare dinamicamente un'ImageView
« Risposta #10 il: 18 Agosto 2010, 13:42:59 CEST »
0
Per quanto riguarda la dimensione non è statica, ho fatto l'esempio statico per capirci, ma nel codice è dimanico perché dopo aver fatto un certo numero di click l'immagine deve cambiare.

L'altro problema dei 50px con il codice che hai postato mi da sempre la risoluzione dello schermo cioè quello dell'emulatore 480 x 320 è lo stesso riusltato che mi dava anche il metodo che usavo io.

Si JD lo so che è meglio usare i dp, ma in questo caso come faccio? Tu sai qualche metodo per sapere l'area veramente utilizzabile?

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Posizionare dinamicamente un'ImageView
« Risposta #11 il: 18 Agosto 2010, 14:20:49 CEST »
0
No mi spiace, purtroppo non sono molto ferrato nella grafica 2D/3D :(. Comunque citavo i dp solo come esempio, da quel che ho visto i dp sono molto usati nell'XML, mentre nel codice Java ho visto quasi sempre utilizzare i px.
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline tavy

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone
  • Sistema operativo:
    Ubuntu 10.04
Re:Posizionare dinamicamente un'ImageView
« Risposta #12 il: 19 Agosto 2010, 09:31:30 CEST »
0
Per quanto riguarda il posizionamento dinamico ho risolto.
Adesso rimane il problema della dimensione effettiva.

Offline enos

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
Re:Posizionare dinamicamente un'ImageView
« Risposta #13 il: 14 Settembre 2010, 16:04:42 CEST »
0
Ciao ragazzi,
scusate se riapro questa vecchia discussione ma vorrei chiedere un vostro parere sulla stessa questione. Ho un file di Layout così:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent">
       
                <SurfaceView android:id="@+id/camera_surface"
                       android:layout_width="fill_parent"
                       android:layout_height="fill_parent"
                       android:layout_weight="1">
                       
                </SurfaceView>
               
                <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Benvenuto" android:layout_alignParentRight="true" android:id="@+id/benvenuto" android:textColor="#ffffff" android:textSize="15px">
                </TextView>
                <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Nome applicazione" android:layout_alignParentLeft="true" android:textColor="#ffffff" android:textSize="15px"/>                                
                 <Button android:id="@+id/Button01" android:layout_width="wrap_content" android:text="@+id/Button01" android:layout_centerHorizontal="true" android:layout_height="wrap_content"></Button>
                 <LinearLayout android:layout_height="wrap_content" android:layout_toLeftOf="@+id/ImageView01" android:id="@+id/LinearLayout01" android:layout_centerHorizontal="true" android:layout_centerInParent="true" android:layout_width="fill_parent">
                                 <ImageView android:id="@+id/ImageView01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/icon"></ImageView>
                  </LinearLayout>

</RelativeLayout>

E nel codice l'esecuzione del codice:
Codice (Java): [Seleziona]
findViewById(R.id.ImageView01).layout(100,100,findViewById(R.id.ImageView01).getWidth(),findViewById(R.id.ImageView01).getHeight());
non provoca assolutamente nessun cambiamento... sapete dirmi come mai??  :-\

Grazie mille!
« Ultima modifica: 14 Settembre 2010, 16:06:39 CEST da JD, Reason: Usate i bbcode java e xml!! xD »

Offline enos

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
Re:Posizionare dinamicamente un'ImageView
« Risposta #14 il: 14 Settembre 2010, 17:52:00 CEST »
0
Scusate se mi rispondo da solo, ma (finalmente) ho un aggiornamento. Ho modificato il codice così:

Codice (Java): [Seleziona]
int width_d = getApplicationContext().getResources().getDisplayMetrics().widthPixels;
int height_d = getApplicationContext().getResources().getDisplayMetrics().heightPixels;
findViewById(R.id.ImageView01).layout( width_d/2-findViewById(R.id.ImageView01).getWidth()/2, height_d/2-findViewById(R.id.ImageView01).getHeight()/2,findViewById(R.id.ImageView01).getWidth()/2+width_d/2,findViewById(R.id.ImageView01).getHeight()/2+height_d/2);

In orizzontale riesco a posizionare l'immagine perfettamente al centro, in verticale non si centra mai bene. Suggerimenti?

Grazie  :-)