Android View回顾之坐标系

前言

Android坐标系其实就是一个三维坐标,Z轴向上,X轴向右,Y轴向下。这三维坐标的点处理就能构成Android丰富的界面或者动画等效果。

Android 相对坐标系

在Android中,将屏幕最左上角的顶点作为Android坐标系的原点,从这个点向右是X轴正方向,从这个点向下是Y轴正方向。如下图所示:
Android绝对坐标系

View 提供获取坐标方法

  • getTop()
    获取到的是View自身的顶边到其父布局顶边的距离
  • getLeft()
    获取到的是View自身的左边到其父布局左边的距离
  • getRight()
    获取到的是View自身的右边到其父布局左边的距离
  • getBottom()
    获取到的是View自身的底边到其父布局顶边的距离
  • getX()
    获取View左上角的坐标X轴上的坐标(相对于父布局)。返回值为getLeft()+getTranslationX(),注意:View在平移的过程中,getLeft()表示的是原始左上角的X轴距离,其值不会改变。发生改变的是getX()、getTranslationX()
  • getY()
    获取View左上角的坐标Y轴上的坐标(相对于父布局)。返回值为getTop()+getTranslationY(),注意:View在平移的过程中,getTop()表示的是原始左上角的Y轴距离,其值不会改变。发生改变的是getY()、getTranslationY()

Android 绝对坐标系

Android绝对坐标系

MotionEvent提供距离相关方法

  • getX()
    获取触摸事件距离控件左边的距离
  • getY()
    获取触摸事件距离控件顶边的距离
  • getRawX()
    获取触摸事件距离整个屏幕左边的距离
  • getRawY()
    获取触摸事件距离整个屏幕顶边的距离

View 宽高相关方法

  • getWidth()
    返回值是mRight-mLeft,一般会参考measure的宽度,调用layout()后有效
  • getHeight()
    返回值是mBottom-mTop,一般会参考measure的高度,调用layout()后有效
  • getMeasuredWidth()
    返回measure过程得到的mMeasuredWidth值,供layout参考
  • getMeasuredHeight()
    返回measure过程得到的mMeasuredHeight值,供layout参考

Android屏幕区域划分

Android屏幕区域
这些区域里常用一些坐标或者度量方式

//获取屏幕区域的宽高等尺寸获取
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int widthPixels = metrics.widthPixels;
int heightPixels = metrics.heightPixels;
//应用程序App区域宽高等尺寸获取
Rect rect = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
//获取状态栏高度
Rect rect= new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rectangle.top;
//获取状态栏高度
Rect rect= new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rectangle.top;
//View布局区域宽高等尺寸获取
Rect rect = new Rect();  
getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(rect);  

特别注意: 上面这些方法最好在Activity的onWindowFocusChanged ()方法内或者之后调运,因为只有这时候才是真正的显示。

参考:
Android应用坐标系统全面详解

猜你喜欢

转载自blog.csdn.net/xufei5789651/article/details/107596691