天天看點

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