Android View (1) View的樹形結(jié)構(gòu)和坐標(biāo)計(jì)算

本系列文章循序漸進(jìn)的學(xué)習(xí)Android View的使用和核心源碼分析缩抡。
Android View (1) View的樹形結(jié)構(gòu)和坐標(biāo)計(jì)算
Android View (2) View的加載過程
Android View (3) View LayoutInflater 源碼分析
Android View (4) View的繪制過程

View的樹形結(jié)構(gòu)

  1. View 是Android UI 控件的基類,ViewGroup也是繼承自View澎蛛,Android中的控件分為兩部分宗兼,直接繼承自View的控件和繼承ViewGroup的布局(控件的集合)躏鱼,使整個(gè)Android控件形成的界面呈現(xiàn)出一個(gè)樹形結(jié)構(gòu)。每個(gè)父控件要負(fù)責(zé)繪制和測(cè)量下層控件殷绍,并進(jìn)行事件傳遞交互染苛。每棵樹的根都存在一個(gè)核心的ViewParent對(duì)象,負(fù)責(zé)對(duì)整個(gè)視圖進(jìn)行統(tǒng)一的調(diào)度和分配主到。ViewParent相當(dāng)于控件樹的心臟茶行。
  2. 在Android中贸呢,一個(gè)Activity的View結(jié)構(gòu)如圖所示:
    Activity的View結(jié)構(gòu).png

    在每個(gè) Activity 創(chuàng)建時(shí),同時(shí)會(huì)創(chuàng)建一個(gè) Window (抽象類)拢军,Window 的具體通過 PhotoWindow 類實(shí)現(xiàn)楞陷,它也是唯一的 Window 實(shí)現(xiàn)類,PhotoWindow 又創(chuàng)建了一個(gè) DecorView(間接的繼承自View)作為整個(gè)Activity的根布局茉唉。DecorView 被分為兩部分:ActionBar 部分(一般開發(fā)過程中都會(huì)隱藏固蛾,采用 google 推薦的 ToolBar)和 id 為 content的FragmentLayout部分,我們 setContentView(@LayoutRes int layoutResID) 設(shè)置的Activity XML布局就是在FragmentLayout中(這部分的加載過程度陆,下篇專門展開)接下來看android中的坐標(biāo)系艾凯。

坐標(biāo)系的計(jì)算

android坐標(biāo)系分為兩類: 絕對(duì)坐標(biāo)系(相對(duì)于設(shè)備的屏幕)和相對(duì)坐標(biāo)系也稱視圖坐標(biāo)系(相對(duì)于父控件)。

  1. 絕對(duì)坐標(biāo)系 如圖所示:
    絕對(duì)坐標(biāo)系.png

在Android中懂傀,將屏幕的左上角的頂點(diǎn)作為Android坐標(biāo)系的原點(diǎn)趾诗,這個(gè)原點(diǎn)向右是X軸正方向,原點(diǎn)向下是Y軸正方向蹬蚁。在這里主要強(qiáng)調(diào)MotionEvent觸摸事件的getRawX()和getRawY():是獲取的絕對(duì)坐標(biāo)恃泪,還有絕對(duì)坐標(biāo)經(jīng)常需要計(jì)算的幾個(gè)方法,在執(zhí)行測(cè)量的系統(tǒng)方法是,需要在布局加載出來之后進(jìn)行 一般在onWindowFocusChanged(boolean hasFocus)方法中執(zhí)行 :

//獲取整個(gè)屏幕寬高:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int widthPixels = metrics.widthPixels;
int heightPixels = metrics.heightPixels;
//獲取狀態(tài)欄高度
Rect rect= new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rectangle.top;
//應(yīng)用程序App區(qū)域?qū)捀叩瘸叽绔@取
Rect rect = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
//View布局區(qū)域?qū)捀叩瘸叽绔@取
Rect rect = new Rect();
getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(rect);
  1. 視圖坐標(biāo)系 如圖所示:
    視圖坐標(biāo)系.png

視圖坐標(biāo)系其實(shí)就是我們?cè)谧远x控件犀斋,繪制過程中參考的坐標(biāo)系贝乎,也就是View自身相對(duì)于父控件的距離,一般獲取坐標(biāo)的方法有:

//View提供的方法:
//獲取View自身頂邊到其父布局頂邊的距離
view.getTop()   
//獲取View自身左邊到其父布局左邊的距離
view.getLeft()  
//獲取View自身右邊到其父布局左邊的距離
view.getRight() 
//獲取View自身底邊到其父布局頂邊的距離
view.getBottom()
//返回值為getLeft()+getTranslationX()叽粹,當(dāng)setTranslationX()時(shí)getLeft()不變览效,getX()變。
view.getX() 
//返回值為getTop()+getTranslationY()虫几,當(dāng)setTranslationY()時(shí)getTop()不變锤灿,getY()變。
view.getY()
//MotionEvent提供的方法:
//獲取點(diǎn)擊事件距離控件左邊的距離辆脸,即視圖坐標(biāo)
getX()
//獲取點(diǎn)擊事件距離控件頂邊的距離但校,即視圖坐標(biāo)
getY()
//獲取點(diǎn)擊事件距離整個(gè)屏幕左邊距離,即絕對(duì)坐標(biāo)
getRawX()
//獲取點(diǎn)擊事件距離整個(gè)屏幕頂邊的的距離每强,即絕對(duì)坐標(biāo)
getRawY()

還有一些滑動(dòng)始腾、動(dòng)畫的方法會(huì)在動(dòng)畫、滑動(dòng)事件的專題進(jìn)行解釋空执。

參考:

  1. 源碼:http://androidxref.com/8.0.0_r4/xref/frameworks/base/core/
  2. 扔物線 博客:http://hencoder.com/
  3. 簡(jiǎn)書:
    http://www.reibang.com/p/f76a6f6f75aa setContentView 加載視圖機(jī)制
    http://www.reibang.com/p/0819a858b53c setContentView 源碼分析
    http://www.reibang.com/p/bb7977990baa android view繪制流程,源碼解讀
    http://www.reibang.com/p/b272528165a2 android 自定義view
  4. ColorFilter:https://github.com/chengdazhi/StyleImageView(自定義view的玩法)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末穗椅,一起剝皮案震驚了整個(gè)濱河市辨绊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匹表,老刑警劉巖门坷,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宣鄙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡默蚌,警方通過查閱死者的電腦和手機(jī)冻晤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绸吸,“玉大人鼻弧,你說我怎么就攤上這事〗踝拢” “怎么了攘轩?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)码俩。 經(jīng)常有香客問我度帮,道長(zhǎng),這世上最難降的妖魔是什么稿存? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任笨篷,我火速辦了婚禮,結(jié)果婚禮上瓣履,老公的妹妹穿的比我還像新娘冕屯。我一直安慰自己,他們只是感情好拂苹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布安聘。 她就那樣靜靜地躺著,像睡著了一般瓢棒。 火紅的嫁衣襯著肌膚如雪浴韭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天脯宿,我揣著相機(jī)與錄音念颈,去河邊找鬼。 笑死连霉,一個(gè)胖子當(dāng)著我的面吹牛榴芳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跺撼,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼窟感,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了歉井?” 一聲冷哼從身側(cè)響起柿祈,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后躏嚎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜜自,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年卢佣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了重荠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡虚茶,死狀恐怖戈鲁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情媳危,我是刑警寧澤荞彼,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站待笑,受9級(jí)特大地震影響鸣皂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜暮蹂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一寞缝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧仰泻,春花似錦荆陆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至棠枉,卻和暖如春浓体,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辈讶。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工命浴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贱除。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓生闲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親月幌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碍讯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355