1. 程式人生 > >android之View座標系(view獲取自身座標的方法和點選事件中座標的獲取)

android之View座標系(view獲取自身座標的方法和點選事件中座標的獲取)

在做一個view背景特效的時候被座標的各個獲取方法搞暈了,幾篇抄來抄去的部落格也沒弄很清楚。

現在把整個總結一下。

其實只要把下面這張圖看明白就沒問題了。

涉及到的方法一共有下面幾個:

view獲取自身座標:getLeft(),getTop(),getRight(),getBottom()

view獲取自身寬高:getHeight(),getWidth()

motionEvent獲取座標:getX(),getY(),getRawX(),getRawY()

首先是view的幾個方法,

獲取自身的寬高的這兩個方法很清楚,不用多說,獲取座標的這幾個就有點混亂了。

根據上面的圖應該會比較容易明白,圖中螢幕上放了一個ViewGroup佈局,裡面有個View控制元件

getTop:獲取到的,是view自身的頂邊到其父佈局頂邊的距離

getLeft:獲取到的,是view自身的左邊到其父佈局左邊的距離

getRight:獲取到的,是view自身的右邊到其父佈局左邊的距離

getBottom:獲取到的,是view自身的底邊到其父佈局頂邊的距離

這些方法獲取到的資料可以用在什麼地方呢?
比如要實現一個自定義的特殊佈局,像http://blog.csdn.net/singwhatiwanna/article/details/42614953
這裡要實現的是一個水波紋特效佈局,該佈局內的任何控制元件點選後都會出現波紋效果
那麼在點選了佈局內的一個控制元件之後,就要通過不斷重新整理佈局,去更新這個控制元件上面的波紋半徑,為了節省資源,每次重新整理佈局都時候不會整個佈局都重新整理,而只是通過
[java] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. postInvalidateDelayed(INVALIDATE_DURATION, left, top, right, bottom);    

在佈局的畫布上每次只去更新點選事件所點選的對應的控制元件的位置,那麼這裡就可以用view的那四個方法,分別獲取自身的四條邊對應的座標

從而讓佈局去重新整理重繪。

當然部落格中是使用絕對座標去計算的,因為這裡實現的是一個佈局,可能裡面還會巢狀另外的佈局,經過多次巢狀之後所獲取到的值,是相對於控制元件直接對應的父佈局(這個佈局有可能已經是我們重寫的佈局的子佈局了)的距離,這樣去重新整理的區域肯定是不準確的,所以部落格裡面使用相對螢幕的絕對座標計算需要重新整理的控制元件區域。

如果這裡自定義的不是佈局,而只是一個控制元件的話,就可以通過以上方法獲取到座標,然後要求自己所在的佈局去重繪這一區域就可以了。當然這只是一種思路,其實沒必要去要求佈局重繪,完全可以直接view自身重繪就可以了。

然後是motionEvent的方法:

getX():獲取點選事件相對控制元件左邊的x軸座標,即點選事件距離控制元件左邊的距離

getY():獲取點選事件相對控制元件頂邊的y軸座標,即點選事件距離控制元件頂邊的距離

getRawX():獲取點選事件相對整個螢幕左邊的x軸座標,即點選事件距離整個螢幕左邊的距離

getRawY():獲取點選事件相對整個螢幕頂邊的y軸座標,即點選事件距離整個螢幕頂邊的距離

這些方法可以用在什麼地方呢?

getRawX和getRawY在之前那篇部落格裡廣泛使用了,可以去那裡看用法,getX()和getY()這兩個方法在對view進行自定義的時候可能用的會比較多。

之後有篇部落格寫開頭實現的特效,可以看下,下面是連結。

作者:jason0539