2015-05-12 7 views
9

Sto scrivendo un'applicazione drag and drop e sono davvero confuso a causa di alcuni parametri.I metodi getTop(), getLeft(), getX(), getY(), getLeft(), getHeight() della vista Android

Si prega di aiutare a capire.

Prima di tutto, ho letto la documentazione per la classe View e ho ottenuto le seguenti spiegazioni.

getX() : The visual x position of this view, in pixels.

getY() : The visual y position of this view, in pixels.

getWidth() : Return the width of the your view.

getHeight() : Return the width of the your view.

getTop() : Top position of this view relative to its parent.

getLeft() : Left position of this view relative to its parent.

Ora, quando abbiamo finito con la documentazione ufficiale, vediamo cosa abbiamo.

Ho un'immagine con dimensione originale 500x500 chiamata cerchio.

enter image description here

Ed ecco lo screenshot effettivo della mia applicazione

enter image description here

Ecco l'XML per il layout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center"> 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="100dp" 
     android:layout_height="100dp" 
     android:src="@drawable/circle" /> 
</LinearLayout> 

Ora che cosa sono io preoccupati. Quando guardo la mia gente del posto, ottengo il seguente, che mi confonde davvero.

enter image description here

non vedo alcun problema con i getX() e getY() funzioni, perché in realtà mi indicano dove il soggetto inquadrato cominciare.

Come afferma di documentazione, i metodi e getWidth()getHeight restituiscono la larghezza e l'altezza della vista, ma la finestra di controllo mi dice che il mio getWidth() e getHeight sono 300, che davvero non riesco a capire, perché nella mia XML I' li ho impostati 100dp ciascuno, così le funzioni me li restituiscono in una misura diversa, e come posso convertirlo in dp.

E infine, mi dice che getTop() e getLeft sono 700 e 300 e, come dice la documentazione, sono la posizione dell'immagine relativa al suo genitore. Ma non è il mio genitore il layout lineare, quindi cosa significano questi numeri nel senso del posizionamento dello schermo?

risposta

5

Tutti questi metodi di misurazione restituiscono le dimensioni in pixel (px), non i pixel di densità (dp).Se si desidera convertire esso è possibile ottenere la densità chiamando:

float density = getResources().getDisplayMetrics().density; 

E poi dividere i valori che si ottiene con la densità prevista, ad esempio:

int widthDp = (int)(img.getWidth()/density); 
+0

così funziona anche getX() in px-s? – Carmine

+0

@Carmine si, consultare la documentazione: http://developer.android.com/reference/android/view/View.html#getX() –

4

È possibile ottenere pixel da DP con

float ht_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ht, getResources().getDisplayMetrics()); 
float wt_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, wt, getResources().getDisplayMetrics()); 

A partire dalla domanda di posizionamento. getTop e getLeft sono valori relativi e sono basati sul genitore. Dal momento che l'unico genitore del vostro ImageView è LinearLayout si sta effettivamente Collocazione del ImageView direttamente sotto il ActionBar/ToolBar

Inoltre, non usare un'immagine per un cerchio, è possibile disegnare facilmente con canvas.drawCircle ci vuole molto meno memoria.

+0

ok, ma rimane ancora una domanda per me, anche quando divido per densità, Vado a sinistra come 130, come mai può essere 130 dp se è giusto sul lato sinistro dello schermo? – Carmine

+1

@Carmine getLeft() e getTop() forniscono posizioni della vista rispetto al relativo genitore prima di spostarsi, in xml si imposta la gravità al centro, quindi è considerato centrato nel genitore .. getX() e getY() danno posizioni dopo aver spostato –

+0

le parole "prima di spostarsi" ha spiegato tutto))) grazie) – Carmine