準備寫自定義View這個專欄的文章,從最基礎的坐标系到Demo。本着鞏固自身知識的意願,不足之處還請大家多多包涵。
之是以要先掌握Android的坐标系,因為view是靠坐标來确定它在螢幕當中的位置。了解Android的坐标系後,将會對的View的布局有一定的概念感。
首先Android中以螢幕的左上角為原點坐标(0,0);

需要值得注意的是,以原點為中心。Y軸向下為正,向上則為負。X軸和數學裡面一樣,左負,右正。
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(觸摸事件 )也提供擷取坐标方法:
getX()
點選事件距離view自身左邊的距離,相對坐标。
getY()
點選事件距離view自身頂部的距離,相對坐标。
getRawX()
點選事件距離螢幕左邊的距離,絕對坐标
getRawY()
點選事件距離螢幕頂部的距離,絕對坐标
兩種擷取坐标的方式有着不同的意義和使用場景,接着來說一說自定義View中的Layout方法。
說之前大家可以想象一下,下拉重新整理時候的場景。
分為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,可以下載下傳下來看一看。隻是實作了布局和滑動,後續會完善。
github位址:https://github.com/yangjiechina/PullRefreshDemo