屏幕的坐标原点为屏幕的左上角, 往右为正向 x 轴, 往下为正向 y 轴. 坐标参数顺序一般为, , ,

view可以获取其相对于父ViewGroup的坐标. 这个要跟点击事件MotionEvent的坐标获取方法区别开来

view由于是一个框模型, 所以当确定左上点和右下点的位置, 我们便可以确定一个view的大小和位置. 左上点坐标为 (View.getLeft(), View.getTop()), 右下点坐标 (View.getRight(), View.getBottom())

view 的大小:

宽度 width = getRight() - getLeft()

高度 height = getBottom() - getTop()

这也是 getWidth(), getHeight() 的算法. 其和 getMeasuredWidth(), getMeasuredHeight() 的差别主要在于后者一般是用于测量时获得的宽高, 并带有模式, 是 view 的原始大小. 一般情况下这两者对应的值是一样的, 不过 getWidth(), getHeight() 是在布局后(onLayout)才能获得, 有时可能某些 ViewGroup 在布局时更改了 view 的大小, 从而导致这两者的值不一样

getLeft(), getTop(), getRight(), getBottom() 这 4 个方法获得是view布局时的原始坐标, 其值在测量布局后不会再改变. 而一个view真正在屏幕显示的位置是其偏移量translate原始位置共同决定的. 这其中我们只要确定左上点的位置便可. 其实际左上点位置关系为:

左上点横坐标: float View.getX() = int View.getLeft() + float View.getTranslationX()

左上点纵坐标: float View.getY() = int View.getTop() + float View.getTranslationY()

在引入了Z轴之后(API 21), Z轴关系为: float View.getZ() = int View.getElevation() + float View.getTranslationZ()

特别需要注意的是, 在 activity 中调用这些方法时, 得到的值是 0, 因为此时 view 还未布局, 需要等要view.onMeasure 之后才会进行赋值.

有 4 种方法来获取这些值.

  1. 使用 ViewTreeObserver监听view的 Draw/Layout 事件
  2. 将一个 runnable 添加到 Layout 队列中, 使用 View.post
  3. 重写view.onLayout方法
  4. 重写Activity.onWindowFocusChange方法

view坐标