在做一個view背景特效的時候被坐標的各個獲取方法搞暈了,幾篇抄來抄去的博客也沒弄非常清楚。
如今把整個總結一下。
事實上僅僅要把以下這張圖看明確就沒問題了。
涉及到的方法一共同擁有以下幾個:
view獲取自身坐標:getLeft(),getTop(),getRight(),getBottom()
view獲取自身寬高:getHeight(),getWidth()
motionEvent獲取坐標:getX(),getY(),getRawX(),getRawY()
首先是view的幾個方法,
獲取自身的寬高的這兩個方法非常清楚。不用多說,獲取坐標的這幾個就有點混亂了。
依據上面的圖應該會比較easy明確,圖中屏幕上放了一個ViewGroup布局,里面有個View控件
getTop:獲取到的,是view自身的頂邊到其父布局頂邊的距離
getLeft:獲取到的,是view自身的左邊到其父布局左邊的距離
getRight:獲取到的,是view自身的右邊到其父布局左邊的距離
getBottom:獲取到的,是view自身的底邊到其父布局頂邊的距離
比方要實現一個自己定義的特殊布局,像http://blog.csdn.net/singwhatiwanna/article/details/42614953
這里要實現的是一個水波紋特效布局,該布局內的不論什么控件點擊后都會出現波紋效果
- postInvalidateDelayed(INVALIDATE_DURATION,?left,?top,?right,?bottom);????
在布局的畫布上每次僅僅去更新點擊事件所點擊的相應的控件的位置。那么這里就能夠用view的那四個方法,分別獲取自身的四條邊相應的坐標
從而讓布局去刷新重繪。
當然博客中是使用絕對坐標去計算的,由于這里實現的是一個布局,可能里面還會嵌套另外的布局,經過多次嵌套之后所獲取到的值,是相對于控件直接相應的父布局(這個布局有可能已經是我們重寫的布局的子布局了)的距離,這樣去刷新的區域肯定是不準確的,所以博客里面使用相對屏幕的絕對坐標計算須要刷新的控件區域。
假設這里自己定義的不是布局,而僅僅是一個控件的話,就能夠通過以上方法獲取到坐標,然后要求自己所在的布局去重繪這一區域就能夠了。
當然這僅僅是一種思路,事實上不是必需去要求布局重繪。全然能夠直接view自身重繪就能夠了。
然后是motionEvent的方法:
getX():獲取點擊事件相對控件左邊的x軸坐標,即點擊事件距離控件左邊的距離
getY():獲取點擊事件相對控件頂邊的y軸坐標,即點擊事件距離控件頂邊的距離
getRawX():獲取點擊事件相對整個屏幕左邊的x軸坐標。即點擊事件距離整個屏幕左邊的距離
getRawY():獲取點擊事件相對整個屏幕頂邊的y軸坐標。即點擊事件距離整個屏幕頂邊的距離
這些方法能夠用在什么地方呢?
getRawX和getRawY在之前那篇博客里廣泛使用了,能夠去那里看使用方法,getX()和getY()這兩個方法在對view進行自己定義的時候可能用的會比較多。
之后有篇博客寫開頭實現的特效,能夠看下。以下是鏈接。
view和view group重寫
作者:jason0539
微博:http://weibo.com/2553717707
博客:http://blog.csdn.net/jason0539(轉載請說明出處)