2015-05-12 9 views
9

Piszę aplikację typu "przeciągnij i upuść" i bardzo się pomyliłem z powodu pewnych parametrów.Metody getTop(), getLeft(), getX(), getY(), getWidth(), getHeight(), getY(),

Pomóż to wymyślić.

Przede wszystkim przeczytałem dokumentację klasy View i otrzymałem następujące wyjaśnienia.

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.

Teraz, kiedy skończyliśmy z oficjalną dokumentacją, zobaczmy, co mamy.

Mam obraz o rozmiarze oryginalnym 500x500 nazywany okręgiem.

enter image description here

A oto rzeczywisty zrzut ekranu z mojego wniosku

enter image description here

Oto xml dla układu

<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> 

co teraz jestem zaniepokojony. Kiedy oglądam swoich mieszkańców, otrzymuję następujące informacje, które naprawdę mnie mylą.

enter image description here

nie widzę żadnego problemu z funkcjami getX() i getY(), bo rzeczywiście pokazać mi, gdzie jest obraz zacząć.

Jak stwierdza dokumentacji, metody getWidth() i getHeight zwróci szerokość i wysokość widoku ale okno zegarek mówi mi, że mój getWidth() i getHeight 300, które naprawdę nie mogę zrozumieć, bo w moim XML I” ve ustawić je po 100pb, więc funkcje zwracają mi je w innym pomiarze, i jak mogę przekonwertować to na dp.

I na koniec, mówi mi, że getTop() i getLeft to 700 i 300, a jak mówi dokumentacja, są one pozycją obrazu względem jego rodzica. Ale czy mój rodzic nie jest układem liniowym, więc co oznaczają te cyfry w sensie pozycjonowania ekranu?

Odpowiedz

5

Wszystkie te metody pomiaru zwracają rozmiary w pikselach (px), a nie w pikselach (dp).Jeśli chcesz, aby przekształcić go można uzyskać gęstość poprzez wywołanie:

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

a następnie podzielić wartości można dostać za pomocą dostarczonego gęstości, na przykład:

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

czy getX() działa również w px-s? – Carmine

+0

@ Karminowy tak, zobacz dokumentację: http://developer.android.com/reference/android/view/View.html#getX() –

4

można dostać pikseli z DP

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

Co do pytania dotyczącego pozycjonowania. getTop i getLeft są wartościami względnymi i są oparte na rodzica. Ponieważ jedynym rodzicem swoimi ImageView jest LinearLayout jesteś skutecznie umiejscowienie ImageView bezpośrednio poniżej ActionBar/ToolBar

Również nie użyć obrazu na kole, można go łatwo wyciągnąć z canvas.drawCircle zajmuje znacznie mniej pamięci.

+0

ok, ale wciąż pozostaje dla mnie jedno pytanie, nawet jeśli dzielę przez gęstość, Skręć w lewo jako 130, jak to może być 130 dp, jeśli jest po lewej stronie ekranu? – Carmine

+1

@Carmine getLeft() i getTop() podają pozycje widoku względem jego rodzica przed jego przeniesieniem, w xml ustawiasz grawitację, aby wyśrodkować, więc jej uważa się za wyśrodkowany w rodzicu .. getX() i getY() dają pozycje po przesunięciu –

+0

słowa "przed jego przeniesieniem" wyjaśniły wszystko))) dziękuję) – Carmine

Powiązane problemy