記Android裡的座標

2021-07-04 12:26:42 字數 2996 閱讀 5590

android的座標系統其實是乙個比較細也比較雜的東西,想乙個小的對比文章,以後忘了可以看看。

首先是motionevent的getrawx和getx兩個函式。這個還是比較簡單的,getrawx取的是相對於螢幕的座標,螢幕的原點(0,0)在左上角,x軸正方向是向右,y軸正方向向下。getx是相對于父元件的座標。

其次是幾個view的函式(以y軸為例)。

gety,gettranslationy,getscrolly,gettop,getheight,還有乙個就是getlocationinwindow。

首先說的是gety和gettranslationy,這兩個函式有相同的地方,下面看跟蹤進去看下view的gety的函式原始碼。

public void sety(float y)

可以看到gety實際就是呼叫了gettranslationy,但是不同的是引數是y-mtop,mtop後面再說,看了原始碼大家應該有點了解了,其實兩個函式是差不多的,只是有乙個點小不同,不過這點小不同所帶來的影響還是挺大的,大家在選用函式的時候要慎重,其實一般做view的移動,用gettranslationy比較多。

getscrolly是乙個比較特別的函式,因為它涉及乙個值叫mscrolly,簡單說,getscrolly一般得到的都是0,除非你呼叫過scrollto或scrollby這兩個函式。有幾點要注意的是,不論是scrollto或scrollby,其實都是對view的內容進行滾動而不是對view本身,你可以做個小實驗,乙個linearlayouy背景是黃色,裡面放置乙個子linearlayout背景是藍色,呼叫scrollto或scrollby,移動的永遠是藍色的子linearlayout。還有就是scrollto和scrollby函式的引數和座標系是「相反的」,比如scrollto(-100,0),view的內容是向x軸正方向移動的,這個相反打引號是因為並不是真正的相反,具體可以看原始碼,關於這兩個函式的原始碼分析大家可以看一目了然。

關於getscrolly,我還想多說一句就是,scrollview的滾動,內部就是用scrollto和scrollby來進行的,所以可以用getscrolly來獲取滾動的y值,而listview並不是,listview原始碼的分析大家可以參考郭大俠最新的部落格,分析的很透徹,所以使用getscrolly來獲取listview滾動的y值是行不通的,一直都是0,下面我提供一種計算listview滾動值的獲取方法給大家參考一下。

public int getscrolly() 

int firstvisibleposition = mlistview.getfirstvisibleposition();

int top = c.gettop();

int headerheight = 0;

if (firstvisibleposition >= 1)

return -top + firstvisibleposition * c.getheight() + headerheight;

}

這裡的mplaceholderview是listview的header,所以要單獨考慮。這種方式適用於單一布局的listview。

gettop這個函式也比較特殊,(我講起來比較虛因為我對它了解的還不是很深。。所以下面關於這個函式的看法,都只是我的一家之言,如果有大神了解的更多更好,希望您能指出我說的錯誤的地方,謝謝!) 它特殊就特殊在它「很難改變」,為什麼這麼說呢,因為你不管是呼叫sety,settranslationy,scrollto/scrollby,gettop都不會改變,那gettop獲取的是什麼呢

public final int gettop()

就是mtop,這個mtop之前也出現過,其實它代表的就是在view的layout過程中確定的top值,當你看settop函式的原始碼,

public final void settop(int top)  else 

invalidate(0, yloc, mright - mleft, mbottom - mintop);

}} else

int width = mright - mleft;

int oldheight = mbottom - mtop;

mtop = top;

mrendernode.settop(mtop);

sizechange(width, mbottom - mtop, width, oldheight);

if (!matrixisidentity)

mbackgroundsizechanged = true;

invalidateparentifneeded();

if ((mprivateflags2 & pflag2_view_quick_rejected) == pflag2_view_quick_rejected)

}}

你會發現它會呼叫sizechange這個函式,而不論是sety,settranslationy還是scrollto/scrollby,都是不會呼叫的,所以我認為,這只是我認為啊,只有settop/gettop這兩個函式是關於乙個view的「筋骨」的,也就是layout,其他幾個函式都知識draw層面的,我也進行過驗證,比如乙個linearlayout一開始gettop是250,height為500,使用其他函式,它的height是不會改變的,而當使用settop(150)之後,這個linearlayout的height就程式設計了600!這也算證實了我的猜測吧。

getheight,沒什麼好說的,就是獲取view的高度。

最後乙個是getlocationinwindow,這個函式呢是這樣用的,首先初始化乙個陣列:

private int location = new int[2];
然後

view.getlocationinwindow(childlocation);
之後location[0]就代表這個view相對於螢幕的x座標,loacation[1]就代表這個view相對於螢幕的y座標了。

android座標系統

android 螢幕 view 座標系統 首先明確一下 android中的座標系統 螢幕的左上角是座標系統原點 0,0 原點向右延伸是x軸正方向,原點向下延伸是y軸正方向。一 view的座標 需要注意view的座標是相對父容器而言的,包括 gettop getbottom getleft getri...

android 座標相關

1 android中的座標系統 在android系統中,螢幕的左上角是座標系統的原點 0,0 座標。原點向右延伸是x軸正方向,原點向下延伸是y軸正方向。2 螢幕的寬和高 為了在螢幕中的合適位置繪製圖形,我們需要使用螢幕的寬和高作為參考,來確定繪製圖形的位置。要獲得螢幕的寬和高,首先從activity...

Android中的座標系統

1 android中的座標系統 在android系統中,螢幕的左上角是座標系統的原點 0,0 座標。原點向右延伸是x軸正方向,原點向下延伸是y軸正方向。2 螢幕的寬和高 為了在螢幕中的合適位置繪製圖形,我們需要使用螢幕的寬和高作為參考,來確定繪製圖形的位置。要獲得螢幕的寬和高,首先從activity...