坐标是自定义控件的基础,例如在处理事件点击、滚动、动画等很多情况时都需要坐标的相关知识。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代表触摸点到屏幕上边的距离;
滑动坐标
滑动坐标也是相对坐标,参考点为外层容器左上角,主要通过getScrollX和getScrollY获取坐标值(滚动距离)。需要注意的是当滚动坐标为正值时,容器内的view是像反方向移动的。例如调用scrollTo(100, 100),容器内的view向X轴和Y轴的负方向同时移动了100像素。
- getScrollX:容器内的view滚动前的X坐标值与滚动后X坐标值的差,即X方向滚动的距离;
- getScrollY:容器内的view滚动前的Y坐标值与滚动后Y坐标值的差,即Y方向滚动的距离;