本文主要是记录学习自定义view中看到的资料,为了方便记忆做了保存整理便于自己学习也方便其他Android开发爱好者学习,参考资料看底部链接。
一、getLocationInWindow和getLocationOnScreen的区别
一个控件在其父窗口中的坐标位置
View.getLocationInWindow(int[] location)
一个控件在其整个屏幕上的坐标位置
View.getLocationOnScreen(int[] location)
1.getLocationInWindow是以B为原点的C的坐标
// location [0]--->x坐标,location [1]--->y坐标
int[] location = new int[2] ;
// 获取在当前窗口内的绝对坐标,getLeft , getTop, getBottom, getRight, 这一组是获取相对在它父窗口里的坐标。
view.getLocationInWindow(location);
2.getLocationOnScreen以A为原点。
// 获取在整个屏幕内的绝对坐标,注意这个值是要从屏幕顶端算起,也就是包括了通知栏的高度。
view.getLocationOnScreen(location);
如果在Activity的OnCreate()事件输出那些参数,是全为0,要等UI控件都加载完了才能获取到这些。
在onWindowFocusChanged(boolean hasFocus)中获取为好。
注意:View.getLocationInWindow()和 View.getLocationOnScreen()在window占据全部screen时,返回值相同,不同的典型情况是在Dialog中时。当Dialog出现在屏幕中间时,View.getLocationOnScreen()取得的值要比View.getLocationInWindow()取得的值要大。
二、Android View坐标getLeft, getRight, getTop, getBottome
在Android坐标系中,以屏幕左上角作为原点,这个原点向右是X轴的正轴,向下是Y轴正轴。如下所示:
Android坐标系中,以屏幕左上角作为原点,这个原点向右是X轴的正轴,向下是Y轴正轴。如下所示:
除了Android坐标系,还存在View坐标系,View坐标系内部关系如图所示。
1.View获取自身高度
由上图可算出View的高度:
- width = getRight() - getLeft();
- height = getBottom() - getTop();
View的源码当中提供了getWidth()和getHeight()方法用来获取View的宽度和高度,其内部方法和上文所示是相同的,我们可以直接调用来获取View得宽高。
2.View自身的坐标
通过如下方法可以获取View到其父控件的距离。
- getTop();获取View到其父布局顶边的距离。
- getLeft();获取View到其父布局左边的距离。
- getBottom();获取View到其父布局顶边的距离。
- getRight();获取View到其父布局左边的距离。
3.相应API汇总及坐标学习理解
视图左侧位置 view.getLeft()
视图右侧位置 view.getRight()
视图顶部位置 view.getTop();
视图底部位置 view.getBottom();
视图宽度 view.getWidth();
视图高度 view.getHeight()
总结: 视图的left , top , right , bottom 的值是针对其父视图的相对位置, 绿色区域是针对其父视图(即黄色区域为(0, 0)点)的坐标,不应该是(115, 170 ) 而是 (55, 55)
参考:
1.https://www.jianshu.com/p/705a6cb6bfee
2.Android View坐标getLeft, getRight, getTop, getBottom - zhengbeibei - 博客园
3.Android坐标getLeft,getRight,getTop,getBottom,getLocationInWindow和getLocationOnScreen_星空物语_新浪博客