我们自定义view 时,不可避免要和Android坐标系打交道,昨天特意去分析实验了一下,记录下来。


首先是一个图

Android坐标系分析_第1张图片


(三个矩形由小到大分别表示  View   View所处的ViewGroup   Screen屏幕)


首先Android屏幕的坐标系是和数学坐标系略有不同的

Android坐标系原点为屏幕左上角的顶点

X轴正方向向右,Y轴正方向向下


图中还有一些获取位置的get方法,这些方法可以分为两类:


View的坐标获取方法(红色线代表View方法的返回值含义)

getTop():获取view自身顶边到父布局顶边的距离

getBottom():获取View自身底边到父布局顶边的距离

getLeft():获取View自身左边到父布局左边的距离

getRight():获取View自身右边到父布局左边的距离

顺便补充一下:

getWidth()getHeight() 是获取view自身的宽和高


这个图中间的橙色点,就是我们手指触摸的位置

也就是MotionEvent  (蓝色线代表是MotionEvent方法获得的值)

MotionEvent提供的方法:

getX(): 获取点击事件距离该View左边的距离

getY(): 获取点击事件距离该View顶边的距离

getRawX(): 获取点击事件距离整个屏幕的左边的距离,绝对坐标

getRawY(): 获取点击事件距离整个屏幕的顶边的距离,绝对坐标(包括通知栏的高度)



然后我们再来看两个获取view位置的方法,先上图

Android坐标系分析_第2张图片


黑色边框 代表的是整个手机屏幕

绿色边框  代表的是状态栏

蓝色边框  代表的是App

红色边框  代表的是App 默认的 TitleBar

橙色边框  代表的是View


View上方有两种颜色的线,代表两个方法获得的View的Y坐标

他们获得的X坐标都是相同的,因为App的左边缘和手机屏幕左边缘重合

但是他们的Y坐标各有不同


View.getLocationInWindow获得的是view在app这个window上的位置

之前我一直以为它是不含状态栏高度的,但是实际打印了一下,也包含状态栏的高度

这点查了一下,也没弄懂哪里不同,提问了,希望有人可以回答我


View.getLocationOnScreen获得的是view在整个手机屏幕上的位置(它获得的Y轴坐标和MotionEvent.getRawY()是一样的)

它是包含状态栏(通知栏)的高度的


关于这两个方法的使用,它们并不是有返回值的,而是靠传入一个引用来获得值

例如

    int[] location = new int[2];    View.getLocationInWindow(location);    int ViewX = location[0];    int ViewY = location[1];


还有,因为Android默认为activity增加一个titleBar 所以你通过setContentView(layout) 设置的布局,都是在titleBar之下的。

如果想取消这个默认的TitleBar,有两种方式


一:在AndroidManifest.xml中加入一行语句

             android:label="@string/app_name"             >


二:在activity中的onCreate方法中加入一行语句

protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);  //这句        setContentView(R.layout.activity_main);    }

记得一定要写在setContentView之前,不然会报错


然后我写了一个程序来输出上述我说的这些结果,大家可以下载方便实验一下

Log截图

Android坐标系分析_第3张图片


测试项目地址 https://github.com/Wizwizard/AndroidCoordinate


觉得有用的话,支持一下。。。因为我从来没见过有人评论我。。。





更多相关文章

  1. Android内核开发:理解和掌握repo工具(含被墙后的下载方法)
  2. webapp打包为Android的apk包的一种方法
  3. Android智能指针使用方法介绍
  4. [Android] ListView (普通列表控件) 的基本使用方法
  5. JS调用Android里面的方法,Android调用JS里面的方法
  6. Android App多个入口的实现方法
  7. Android 项目导入eclipse中报错但找不到错误地方的解决方法

随机推荐

  1. Android(安卓)高仿微信6.0主界面 带你玩
  2. Android(安卓)性能优化5 - 内存优化
  3. Android(安卓)Developers:简单的拍照
  4. Android动态布局小结
  5. 关于android面试的几个问题
  6. Android(安卓)Studio 将Library打包成jar
  7. kotlin优雅实现AIDL
  8. Unity在Android(安卓)6.0及以上版本弹出
  9. Android(安卓)NDK 简介、工具安装、环境
  10. android 整数与ip地址的转换