最近在學習<<Android開發(fā)藝術(shù)探索>>這本書诗赌,把一些android的核心概念講解的很清晰鲁僚, 在看3.1.2 View的位置參數(shù)這節(jié)時曼月,對View的幾個參數(shù)沒搞透徹,本文對這些容易混淆的概念排疑解惑一下衙猪。
其實只要把下面這張圖看明白就沒問題了。
上面的"藍點"表示的一次點擊事件布近。
涉及到的方法一共有下面幾個:
view獲取自身坐標:getLeft(),getTop(),getRight(),getBottom()
view獲取自身寬高:getHeight(),getWidth()
motionEvent獲取坐標:getX(),getY(),getRawX(),getRawY()
上面幾個參數(shù)表達的含義很清晰垫释, 比較讓人疑惑的是書中提到的,View的x,y, translationX撑瞧, translationY這4個參數(shù)的含義棵譬。
含義如下:
translationX,translationY: View顯示相對于初始位置的偏移量.
x,y: View最終可見時的坐標,是View的left预伺,top位置加上translationX订咸,translationY.
left, top: 是View初始在ViewGroup布局時的左上角坐標曼尊。
這幾個參數(shù)是理解View動畫的基礎(chǔ)。
在View Animation中脏嚷,對View應(yīng)用Animation并沒有改變View的left, top, right, bottom的屬性值骆撇,動畫的實現(xiàn)是通過其Parent View實現(xiàn)的,在View被drawn時Parents View改變它的繪制參數(shù)父叙,draw后再改變參數(shù)invalidate神郊,這樣雖然View的大小或旋轉(zhuǎn)角度等改變了或進行了平移,但View的實際屬性沒變趾唱,所以有效區(qū)域還是應(yīng)用動畫之前的區(qū)域涌乳,比如你把一按鈕放大兩倍,但還是放大之前的區(qū)域可以觸發(fā)點擊事件甜癞。(注意:使用屬性動畫可以解決實施動畫前后點擊事件響應(yīng)區(qū)域不一致的問題夕晓。)
跟位置有關(guān)的參數(shù)有3個,以X坐標為例悠咱,可以通過getLeft(),getX(),getTranslateX()獲得运授,若有一Button btn2,布局時其坐標為(40,0):
//應(yīng)用動畫之前
btn2.getLeft(); //40
btn2.getX(); //40
btn2.getTranslationX(); //0
//應(yīng)用translationX動畫
ObjectAnimator oa=ObjectAnimator.ofFloat(btn2,"translationX", 200);
oa.setDuration(2000);
oa.start();
/*應(yīng)用translationX動畫后
btn2.getLeft(); //40
btn2.getX(); //240
btn2.getTranslationX(); //200
*/
//應(yīng)用X動畫乔煞,假設(shè)沒有應(yīng)用之前的translationX動畫
ObjectAnimator oa=ObjectAnimator.ofFloat(btn2, "x", 200);
oa.setDuration(2000);
oa.start();
/*應(yīng)用X動畫后
btn2.getLeft(); //40
btn2.getX(); //200
btn2.getTranslationX(); //160
*/
無論怎樣應(yīng)用動畫吁朦,原來布局時的位置通過getLeft()獲得,保持不變渡贾。
X是View最終顯示時的位置逗宜;
translationX為最終顯示位置與布局時初始位置這差。
所以O(shè)bjectAnimator.ofFloat(), 若就用translationX即為在原來基礎(chǔ)上移動多少空骚,若用X為最終要移動到X軸的哪個位置纺讲。
getX()的值為getLeft()與getTranslationX()之和。
參考:
http://blog.csdn.net/jason0539/article/details/42743531
http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html