View坐标系

最近在学习<<Android开发艺术探索>>这本书,把一些android的核心概念讲解的很清晰, 在看3.1.2 View的位置参数这节时,对View的几个参数没搞透彻,本文对这些容易混淆的概念排疑解惑一下。
其实只要把下面这张图看明白就没问题了。

view坐标系.png

上面的"蓝点"表示的一次点击事件。
涉及到的方法一共有下面几个:
view获取自身坐标:getLeft(),getTop(),getRight(),getBottom()
view获取自身宽高:getHeight(),getWidth()
motionEvent获取坐标:getX(),getY(),getRawX(),getRawY()

上面几个参数表达的含义很清晰, 比较让人疑惑的是书中提到的,View的x,y, translationX, translationY这4个参数的含义。

含义如下:
translationX,translationY: View显示相对于初始位置的偏移量.
x,y: View最终可见时的坐标,是View的left,top位置加上translationX,translationY.
left, top: 是View初始在ViewGroup布局时的左上角坐标。

这几个参数是理解View动画的基础。
在View Animation中,对View应用Animation并没有改变View的left, top, right, bottom的属性值,动画的实现是通过其Parent View实现的,在View被drawn时Parents View改变它的绘制参数,draw后再改变参数invalidate,这样虽然View的大小或旋转角度等改变了或进行了平移,但View的实际属性没变,所以有效区域还是应用动画之前的区域,比如你把一按钮放大两倍,但还是放大之前的区域可以触发点击事件。(注意:使用属性动画可以解决实施动画前后点击事件响应区域不一致的问题。)

跟位置有关的参数有3个,以X坐标为例,可以通过getLeft(),getX(),getTranslateX()获得,若有一Button btn2,布局时其坐标为(40,0):

//应用动画之前
btn2.getLeft();    //40
btn2.getX();    //40
btn2.getTranslationX();    //0
//应用translationX动画
ObjectAnimator oa=ObjectAnimator.ofFloat(btn2,"translationX", 200);
oa.setDuration(2000);
oa.start();
/*应用translationX动画后
btn2.getLeft();    //40
btn2.getX();    //240
btn2.getTranslationX();    //200
*/
//应用X动画,假设没有应用之前的translationX动画
ObjectAnimator oa=ObjectAnimator.ofFloat(btn2, "x", 200);
oa.setDuration(2000);
oa.start();
/*应用X动画后
btn2.getLeft();    //40
btn2.getX();    //200
btn2.getTranslationX();    //160
*/

无论怎样应用动画,原来布局时的位置通过getLeft()获得,保持不变。
X是View最终显示时的位置;
translationX为最终显示位置与布局时初始位置这差。
所以ObjectAnimator.ofFloat(), 若就用translationX即为在原来基础上移动多少,若用X为最终要移动到X轴的哪个位置。
getX()的值为getLeft()与getTranslationX()之和。

参考:
http://blog.csdn.net/jason0539/article/details/42743531
http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html

推荐阅读更多精彩内容