Android的View位置由四个顶点来决定,分别对应View的四个属性.left,top,right,bottom. 分别对应的左上角的x,y坐标和右下角的x,y坐标.注意这些坐标都是相对于该View的父容器来说的. 通过View的getLeft(),getRight()等获取相应的值. 同时View的getWidth()方法的源码如下:
/** * Return the width of the your view. * * @return The width of your view, in pixels. */@ViewDebug.ExportedProperty(category = "layout")public final int getWidth() { return mRight - mLeft;}
getHeight()方法如下:
/** * Return the height of your view. * * @return The height of your view, in pixels. */@ViewDebug.ExportedProperty(category = "layout")public final int getHeight() { return mBottom - mTop;}
而这里的四个变量mLeft,mTop,mRight,mBottom是在什么时候给赋值的呢? 就是在View的onLayout方法赋值的.因为在这个方法中通常会调用类似 view.layout(l,t,r,b)如下的代码. 这也就是为什么自定义view的时候在重写onLayout()方法时, 如果需要获取宽高,不能通过getWidth()获取 而是要通过getMeasuredWidth()去获取.因为在onLayout的是时候mRight,mLeft等变量还没有 被赋值呢.而getMeasuredWidth()这个方法的值是在onMeasure()方法中通过最终的 setMeasuredDimension()给设置进去的.
从Android3.0开始,View增加了几个参数x,y,translationX,translationY. 其中x,y是这个view的左上角的坐标.而translationX和translationY是这个View 的左上角相对于父容器的偏移量.并且translationX和translationY的默认值是0. x = left + translationX; y = top + translationY; 注意:在view平移的过程中,top和left表示的是原始左上角的位置信息. 这个两个值并不会发生改变.发生改变的是x,y,translationX和translationY.
注意这里说的是平移.平移是什么呢?就是通过propertyAnimation去改变View的位置
但是发现如果通过LayoutParams的leftMargin等属性去改变一个view的位置的时候. getLeft()的值是会变化的. 这里要注意.
关于MotionEvent的getX()和getRawX()
getX()获取的是当前点击事件的位置距离所在View的左边界的水平位移值; getRawX()后去的是当前点击事件的位置距离屏幕左上角的水平位移值.