坐标是自定义控件的基础,例如在处理事件点击、滚动、动画等很多情况时都需要坐标的相关知识。Android坐标与数学中的相差不大,主要使用两种方式进行描述:绝对坐标和相对坐标。

Android的坐标系是以屏幕的左上角为原点,向下为X的正方向,向右为Y 的正方向(如下图所示)。相当于数学坐标系,以屏幕左上角为原点,顺时针旋转90度。

闲聊自定义控件之基础——坐标

Android坐标系使用相对坐标的情况较多,绝对坐标较少,且相对坐标一般针对其父布局。下面从视图坐标、事件坐标、滚动坐标三个方面进行分析。

视图坐标

视图坐标中常用到的坐标都是相对坐标(如下图所示),即以父布局的左上角为原点。

闲聊自定义控件之基础——坐标

  • getX:子view的左上角到父布局左边的距离,即子view**左上角**X坐标与父布局左上角X坐标的差值;
  • getY:子view左上角到父布局上边的距离,即子view**左上角**Y坐标与父布局左上角Y坐标的差值;

  • getLeft:子view左边到父布局左边的距离,也等同于子view**左上角**X坐标与父布局左上角X坐标的差值;

  • getTop:子view上边到父布局上边的距离,也等同于子view**左上角**Y坐标与父布局左上角Y坐标的差值;

  • getRight:子view右边到父布局左边的距离,等同于子view**右下角**X坐标与父布局左上角X坐标的差值;

  • getBottom:子view下边到父布局上边的距离,等同于子view**右下角**Y坐标与父布局左上角Y坐标的差值;

可能大家比较疑惑,既然getX与getTop以及getY和getTop的值一样,为啥还要提供两套方法呢?它们的值相同的前提是getTranslationX以及getTranslationY的值为0.
- getTranslationX代表的是当前View移动后与移动前左上角的X坐标的差值
- getTranslationY代表的是当前View移动后与移动前左上角的Y坐标的差值

getLeft 和getTop是移动前的值,不随着位置移动变化,而getX和getY随着移动而动态变化,因此有:

  • getX=getLeft+getTranslationX;
  • getY=getTop+getTranslationY;

当然视图也有绝对坐标的方法,只是用的相对较少,如getLocationOnScreen()就可以获得View左上角在屏幕中的位置(参考点为坐标原点)。

事件坐标

事件坐标相对比较简单,常用的有getX和getRawX以及getY和getRawY两组(如下图所示)。

闲聊自定义控件之基础——坐标

其中getX和getY是相对坐标,只是与视图坐标的参考点不一样而已。

  • getX代表触摸点到当前View左边的距离,即触摸点X坐标与触摸View左上角X坐标的差值;

  • getY代表触摸点到当前View上边的距离,即触摸点Y坐标与触摸View左上角Y坐标的差值;

getRawX和getRawY是绝对坐标,参考点为原点的坐标。
- getRawX代表触摸点到屏幕左边的距离;
- getRawY代表触摸点到屏幕上边的距离;

滑动坐标

滑动坐标也是相对坐标,参考点为外层容器左上角,主要通过getScrollXgetScrollY获取坐标值(滚动距离)。需要注意的是当滚动坐标为正值时,容器内的view是像反方向移动的。例如调用scrollTo(100, 100),容器内的view向X轴和Y轴的负方向同时移动了100像素。

  • getScrollX:容器内的view滚动前的X坐标值与滚动后X坐标值的差,即X方向滚动的距离;
  • getScrollY:容器内的view滚动前的Y坐标值与滚动后Y坐标值的差,即Y方向滚动的距离;

相关文章: