即興的靈感

          思維是一種藝術(shù); 藝術(shù)需要靈感。

          導(dǎo)航

          公告

           覺(jué)悟微智能 白米飯自媒體

          留言簿(29)

          隨筆分類

          隨筆檔案

          相冊(cè)

          閱讀排行榜

          評(píng)論排行榜

          博客好友

          最新評(píng)論

          Android中UI視圖之試圖繪制機(jī)制

          在Android中,當(dāng)一個(gè)活動(dòng)Activity接收到焦點(diǎn)時(shí),它將被要求繪制它自己的布局。Android框架將處理這個(gè)繪畫的過(guò)程,但是這個(gè)Activity活動(dòng)必須提供它的布局層次的根節(jié)點(diǎn)。

            繪畫從布局的根節(jié)點(diǎn)開始。它被要求來(lái)測(cè)量和繪制布局樹。繪畫通過(guò)遍歷布局樹并渲染每個(gè)和失效區(qū)域相交的視圖來(lái)處理。相應(yīng)的,每個(gè)視圖組負(fù)責(zé)請(qǐng)求繪制它的子視圖(通過(guò)draw() 方法)而每個(gè)視圖負(fù)責(zé)畫它自己。因?yàn)檫@個(gè)樹是順序遍歷的,這意味著先畫父節(jié)點(diǎn)(也就是在屏幕后面),然后按照樹中出現(xiàn)的順序畫其同層次節(jié)點(diǎn)。


            框架將不會(huì)畫不在失效區(qū)域的視圖,而且還將會(huì)幫你畫視圖背景。

            你可以強(qiáng)制一個(gè)視圖被重畫,通過(guò)調(diào)用invalidate()。

            繪畫布局共有兩步:一個(gè)度量過(guò)程和一個(gè)布局過(guò)程。度量過(guò)程在measure(int, int)里實(shí)現(xiàn)且是一個(gè)自頂向下的視圖樹遍歷。每個(gè)視圖在遞歸時(shí)往下推送尺寸規(guī)格。在度量過(guò)程的最后,每個(gè)視圖都已經(jīng)保存了自己的度量。第二個(gè)過(guò)程發(fā)生在layout(int, int, int, int) 中并且也是自頂向下。在這個(gè)過(guò)程中,每個(gè)父節(jié)點(diǎn)負(fù)責(zé)定位它的所有子節(jié)點(diǎn),通過(guò)使用在度量過(guò)程中計(jì)算得到的尺寸。

            當(dāng)一個(gè)視圖的measure()方法返回時(shí),它的getMeasuredWidth()和getMeasuredHeight() 值必須被設(shè)置,以及所有這個(gè)視圖子節(jié)點(diǎn)的值。一個(gè)視圖的度量的寬度和高度值必須符合父視圖引入的限制。這確保在度量過(guò)程之后,所有父節(jié)點(diǎn)接受所有它們的子節(jié)點(diǎn)的度量值。一個(gè)父視圖可能會(huì)在其子視圖上多次調(diào)用measure()方法。比如,父視圖可能會(huì)通過(guò)未指定的尺寸調(diào)用measure來(lái)發(fā)現(xiàn)它們的大小,然后使用實(shí)際數(shù)值再次調(diào)用measure(),如果所有子視圖未做限制的尺寸總合過(guò)大或過(guò)小(也即是,如果子視圖之間不能對(duì)各自占據(jù)的空間達(dá)成共識(shí)的話,父視圖將會(huì)干預(yù)并設(shè)置第二個(gè)過(guò)程的規(guī)則)。

            要開始一個(gè)布局,可調(diào)用requestLayout()。這個(gè)方法通常在視圖認(rèn)為它自己不再適合它當(dāng)前的邊界的情況下被調(diào)用。

            度量過(guò)程使用兩個(gè)類來(lái)交流尺寸。View.MeasureSpec類被視圖用來(lái)告訴它們的父視圖它們想如何被度量和定位。基礎(chǔ)的LayoutParams類僅僅描述了視圖想有多大(高和寬)。對(duì)于每個(gè)維度,它可以指定下面之一:
          · 一個(gè)準(zhǔn)確的數(shù)值
          · FILL_PARENT, 這意味著視圖想和父視圖一樣大(減掉填充padding)。
          · WRAP_CONTENT, 這意味著視圖只想有剛好包裝其內(nèi)容那么大(加上填充)

            對(duì)于不同的ViewGroup子類,有相應(yīng)的LayoutParams子類。比如,相對(duì)布局RelativeLayout有它自己的LayoutParams子類,這包含了能夠讓子視圖橫向和豎向居中顯示的能力。

            度量規(guī)格(MeasureSpecs)被用來(lái)沿著樹從父到子的下傳度量需求。一個(gè)MeasureSpecs可以是下面三種模式之一:
          ·UNSPECIFIED: 這被父視圖用來(lái)決定其子視圖期望的尺寸。比如,一個(gè)線性布局可能在它的子視圖上調(diào)用measure() on its child,通過(guò)設(shè)置其高度為UNSPECIFIED 以及一個(gè)寬度為EXACTLY 240,來(lái)找出這個(gè)子視圖在給定240像素寬度的情況下需要顯示多高。
          ·EXACTLY: 這被父視圖用來(lái)給子視圖強(qiáng)加一個(gè)準(zhǔn)確的尺寸。子視圖必須使用這個(gè)大小,并確保其所有的后代將適合這個(gè)尺寸。
          ·AT_MOST: 這被父視圖用來(lái)給子視圖強(qiáng)加一個(gè)最大尺寸。子視圖必須確保它自己以及所有的后代都適合這個(gè)尺寸。文章地址



          ?
          鳳凰涅槃/浴火重生/馬不停蹄/只爭(zhēng)朝夕
          ???? 隱姓埋名/低調(diào)華麗/簡(jiǎn)單生活/完美人生

          posted on 2010-10-16 10:02 poetguo 閱讀(1655) 評(píng)論(0)  編輯  收藏 所屬分類: Android

          主站蜘蛛池模板: 剑河县| 汽车| 邻水| 峡江县| 肥西县| 义马市| 揭东县| 台州市| 宁武县| 兰坪| 黔江区| 定远县| 资中县| 连江县| 达日县| 进贤县| 雷州市| 礼泉县| 新竹县| 宿松县| 华容县| 昭通市| 西乡县| 西充县| 新津县| 渭南市| 沙坪坝区| 武邑县| 藁城市| 石柱| 江津市| 河南省| 康保县| 呈贡县| 许昌市| 高邑县| 寻乌县| 图片| 信丰县| 遵义市| 霍州市|