View的位置參數(shù)
View的位置參數(shù)主要由它的四個(gè)頂點(diǎn)來決定,它們分別對(duì)應(yīng)View的四個(gè)屬性:top、left、bottom、right。其中top是左上角縱坐標(biāo),left是左上角橫坐標(biāo),bottom是右下角的縱坐標(biāo),right是右下角的橫坐標(biāo)。需要注意的是:這些坐標(biāo)都是相對(duì)于View的父容器來說的,這是一種相對(duì)坐標(biāo)。如圖所示:

這張圖非常清晰的表達(dá)了我們剛才表述的View相對(duì)位置的內(nèi)容,我們可以很容易的知道View的寬度就是right-left的值,當(dāng)然高度就是bottom-top。同時(shí)我們可以通過getLeft、getTop、getRight、getBottom來獲取left、top、right、bottom的值。
注意:
從Android 3.0開始,View額外添加了x、y、translationX、translationY。其中x和y是View左上角的坐標(biāo),translationX和translationY是View左上角相對(duì)于父容器的偏移量。這幾個(gè)數(shù)值也是相對(duì)于父容器的坐標(biāo),并且translationX和translationY默認(rèn)值都是0。這幾個(gè)參數(shù)的換算關(guān)系如下:
1、x=left+translationX;
2、y=top+translationY;
主要注意的是:View在移動(dòng)過程中,top和left表示的是原始左上角的位置信息,其值不會(huì)發(fā)生改變。此時(shí)發(fā)生改變的是x、y、translationX、translationY。
1、view.getTranslationX計(jì)算的是該view的偏移量。初始值為0,向左偏移值為負(fù),向右偏移值為正。
2、view.getX相當(dāng)于該view距離父容器左邊緣的距離,等于getLeft+getTranslationX。
如圖所示:

我們看到左側(cè)的圖片是初始情況下的。這時(shí)候translationX和translationY都是0。第二張圖我們將View向右側(cè)移動(dòng)X個(gè)位置,我們通過上面的分析知道left、top的值都沒有改變。改變的是translationX。
再談?wù)剅awX
rawX是絕對(duì)坐標(biāo),是相對(duì)于屏幕左上角的橫坐標(biāo),view本身沒有g(shù)etRawX的方法,這個(gè)方法一般在MotionEvent對(duì)象里使用。
如圖所示:

最后總結(jié):
View獲取自身寬高
getHeight():獲取View自身高度
getWidth():獲取View自身寬度
View自身坐標(biāo)
通過如下方法可以獲得View到其父控件(ViewGroup)的距離:
getTop():獲取View自身頂邊到其父布局頂邊的距離
getLeft():獲取View自身左邊到其父布局左邊的距離
getRight():獲取View自身右邊到其父布局左邊的距離
getBottom():獲取View自身底邊到其父布局頂邊的距離
MotionEvent提供的方法
我們看上圖那個(gè)深藍(lán)色的點(diǎn),假設(shè)就是我們觸摸的點(diǎn),我們知道無論是View還是ViewGroup,最終的點(diǎn)擊事件都會(huì)由onTouchEvent(MotionEvent event)方法來處理,MotionEvent也提供了各種獲取焦點(diǎn)坐標(biāo)的方法:
getX():獲取點(diǎn)擊事件距離控件左邊的距離,即視圖坐標(biāo)
getY():獲取點(diǎn)擊事件距離控件頂邊的距離,即視圖坐標(biāo)
getRawX():獲取點(diǎn)擊事件距離整個(gè)屏幕左邊距離,即絕對(duì)坐標(biāo)
getRawY():獲取點(diǎn)擊事件距離整個(gè)屏幕頂邊的的距離,即絕對(duì)坐標(biāo)