android中view坐标相关的知识

来源:互联网 发布:电子发票打印软件 编辑:程序博客网 时间:2024/04/30 06:04

基本概念
Android坐标系:以屏幕左上角为坐标原点,向右为x的正轴,向下为y的正轴。
视图坐标系:以父视图的左上角为坐标原点,向右为x的正轴,向下为y的正轴。

一、View中获取坐标相关的函数

注意:在onCreate方法中是不能获取到坐标的。

1、getX() getY()
这个是view左上角距离父布局的距离,而且这个距离可能会变化,比如使用动画将view移动的时候,这两个坐标就会发生变化。

2、getTranslationX() getTranslationY()
view相对于最初位置的变化量。始终是相对于最初的位置。
同时我们也可以使用set方法比如setTranslationX来动态改变view的位置。所以这一组坐标存在的意义就是为了view的位置变化使用的。

3、getLeft() getTop() getRight() getBottom()
这四个坐标是指一个view的边际距离父布局的距离。Getleft()和getRight()是相对父布局的左边,而getTop()和getBootom()是相对于父布局的上边。所以我们通过这四个值是可以知道view的宽度和高度的。

这三组坐标的关系:getX()= getTranslationX()+getLeft()

4、getPivotX() getPivotY()
view旋转和缩放的时候的中心点

二、MotionEvent中的坐标

1、getX(),getY()
获取视图坐标系中的坐标

2、getRawX(),getRawY()
获取android坐标系中的坐标

以上的四个方法不分view和viewgroup,但是如果是activity中重写onTouchEvent(),则获取到的getX()和getRawX(),getY()和getRawY()是相同的。经过实际测试,activity中根布局在有titlebar的情况下getY()和getRawY()有一个状态栏高度的差距,这也很好理解,因为我们认为的根布局其实外面还有一层FrameLayout,所以我们认为的根布局获取的getY()是在这个FrameLayout坐标系中的坐标。

三、解决在onCreate(),onStart(),onResume()中无法获取view的坐标值的问题。
原因分析:view的measure()的调用与Activity的生命周期不是同步的,所以在生命周期的某个函数中不能保证view已经mearure和Layout完毕。

解决方法(参考任玉刚的书):

1、 在onWindowFocusChanged方法中调用
这个方法表示window焦点的变化,当这个方法被调用时view已经初始化完毕了,自然也就能获取到view的坐标了,缺点:但是这个方法会在焦点发生变化的时候调用,也就会存在多次调用,这点需要注意。
2、 利用view.post(runnable)
这样会把runnable放在一个队列中,view初始化完成的时候就会进行处理,示例代码如下:

view.post(new Runnable(){   @Override   public void run() {      int width=view.getLeft();   }});

3、利用ViewTreeObserver
在ViewTreeObserver中很多监听的回调中都可以实现对view的宽高和坐标的获取。

0 0
原创粉丝点击