天天看点

Android自定义View你所要知道的(一):坐标系

准备写自定义View这个专栏的文章,从最基础的坐标系到Demo。本着巩固自身知识的意愿,不足之处还请大家多多包涵。

之所以要先掌握Android的坐标系,因为view是靠坐标来确定它在屏幕当中的位置。了解Android的坐标系后,将会对的View的布局有一定的概念感。

首先Android中以屏幕的左上角为原点坐标(0,0);

Android自定义View你所要知道的(一):坐标系

需要值得注意的是,以原点为中心。Y轴向下为正,向上则为负。X轴和数学里面一样,左负,右正。

View提供获取坐标的方法:

Android自定义View你所要知道的(一):坐标系

getLeft()

view自身左边距离父ViewGroup左边的距离

getTop()

view自身顶部距离父ViewGroup顶部的距离

getRight()

view自身右边距离父ViewGroup左边的距离

getBottom()

view自身底部距离父ViewGroup顶部的距离

getX()

view自身左边距离父ViewGroup左边的距离

getY()

view自身顶部距离父ViewGroup顶部的距离

getX(),getY()和getTop(),getLeft()意义都一样。不同的是,getX()和getY()返回的数据类型是float,距离更加精确。

最初看见getRight()和getBottom()两方法是还有点蒙,感觉跟字面意不一样。通过view所提供的坐标方法,可以求出View最后的实际宽高。

width = getRight() - getLeft();

height = getBottom()-getTop();

MotionEvent(触摸事件 )也提供获取坐标方法:

Android自定义View你所要知道的(一):坐标系

getX()

点击事件距离view自身左边的距离,相对坐标。

getY()

点击事件距离view自身顶部的距离,相对坐标。

getRawX()

点击事件距离屏幕左边的距离,绝对坐标

getRawY()

点击事件距离屏幕顶部的距离,绝对坐标

两种获取坐标的方式有着不同的意义和使用场景,接着来说一说自定义View中的Layout方法。

说之前大家可以想象一下,下拉刷新时候的场景。

Android自定义View你所要知道的(一):坐标系

分为Header,Content,Footer和包裹这三个View的ViewGroup。默认情况下,Content填满整个屏幕可见区域。在下拉和上拉的时候,header和footer才慢慢的出来。

前面我们说到Android中以屏幕的左上角为原点坐标(0,0),而Content的布局就是原点到屏幕底部这块区域。Header的布局则是在原点之上,Footer布局则是在屏幕底部之下。所以默认情况下只能看见Content区域,通过滑动实现下拉刷新,上拉加载。

layout方法中有4个参数,就是确定View的布局位置和View的最终宽高

layout(getLeft,getTop,getRight,getBottom);

效果图中的三个View的布局参数,则为:

header.layout(0,-(header. getMeasuredHeight()),screenWidth,0);

content.layout(0,0,screenWidth,screenHeight);

footer.layout(0,screenHeight,screenWidth,screenHeight+footer. getMeasuredHeight())

这样就是现实了默认Content可见,header和footer 分别位于于顶部和底部。

做了一个小Demo,可以下载下来看一看。只是实现了布局和滑动,后续会完善。

Android自定义View你所要知道的(一):坐标系

github地址:https://github.com/yangjiechina/PullRefreshDemo