「Android View系列」1.View坐标系

190 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

View是 Android界面体系非常重要的一块,虽然说 View 不属于四大组件范畴,但是作用堪比四大组件。本文将介绍一下View的基础知识:View坐标系,View的位置参数和MotionEvent。

本文总览

新手创作-View坐标系1.png

1.与数学坐标系对比

对于移动设备,一般是将左上角视为坐标系原点,向右为X轴正方向,向下为Y轴正方向。 所以在Android中所说的屏幕坐标系与数学中的点坐标系是有区别的。(如下图所示)

新人创作001坐标系对比.png 后面在开发中所指的坐标系,默认原点都是在左上角,这一点先说明。

2.View的位置参数

在安卓中,坐标系又有Android坐标系(屏幕坐标系)和View坐标系(视图坐标系)区分。

2.1Android坐标系

在Android坐标系中,将屏幕左上角设为原点,原点向下为Y轴正向,原点向右为X正向。

屏幕坐标系.jpg

马上讲到MotionEvent中,getRawX()和getRawY()获取的坐标值,就是参照此坐标系得到。

2.2View坐标系

在日常开发中,绘制View等操作使用的点坐标一般是参考View坐标系,获取到相对坐标。 view坐标系.png 参考以上坐标系,能获取到View一系列常用位置参数:

  • View高度: getHeight()=getBottom()getTop()getHeight() = getBottom() - getTop()
  • View宽度: getWidth()=getRight()getLeft()getWidth() = getRight() - getLeft()
  • getTop()getTop():获取View顶边到其父布局顶边的距离
  • getLeft()getLeft():获取View左边到其父布局左边的距离
  • getRight()getRight():获取View右边到其父布局左边的距离
  • getBottom()getBottom():获取View底边到其父布局顶边的距离

通过视图坐标系,指定View中的任意点的相对坐标都可以计算出来

  • getX()=getRawX()getLeft()getX() = getRawX() - getLeft()
  • getY()=getRawY()getTop()getY() = getRawY() - getTop()

3.MotionEvent

View 源码中 onTouchEvent()

@Override
public boolean onTouchEvent(MotionEvent event) {
    ...
    boolean value = super.onTouchEvent(event);
    ...
    return value;
}

触摸屏幕会产生的一系列事件,典型的事件类型有如下几种:

  • ACTION_DOWN——刚接触屏幕;
  • ACTION_MOVE——在屏幕上移动;
  • ACTION_UP——从屏幕上松开的一瞬间

正常情况下,一次手指触摸屏幕的行为会触发一系列事件,如下:

  • 点击屏幕后松开,事件顺序 DOWN -> UP;
  • 点击屏幕滑动一会再松开,事件顺序 DOWN -> MOVE-> …> MOVE-> UP

通过MotionEvent,可以得到点击事件发生时的坐标(x, y),Android系统提供了对应方法:getX()/getY() 和 getRawX()/getRawY()

  • getX()/getY() 是相对于当前View左上角的x和y坐标;
  • getRawX()/getRawY() 是相对于手机屏幕左上角的x和y坐标。

对于MotionEvent进一步理解,等后面分析View 事件分发处理时,还会讲到。

总结

本文就介绍View里常用的与坐标相关的概念,常用坐标系。这些基础知识对后面的自定义View,View事件分发机制都是非常重要的,为其做铺垫。

掘金(JUEJIN)一起进步!