測(cè)量View(二):測(cè)量寬高及真實(shí)寬高

測(cè)量View(一):創(chuàng)建View并測(cè)量 http://www.reibang.com/p/4fb206b947ee
測(cè)量View(三):獲得測(cè)量寬高及真實(shí)寬高 http://www.reibang.com/p/cbd758a5b5cf

測(cè)量的寬高 與真實(shí)寬高 的區(qū)別

很簡(jiǎn)單用ScrollView舉例凌摄,當(dāng)ScrollView中有很多內(nèi)容一屏顯示不全時(shí)温艇,此時(shí)測(cè)量的高度(HorizontalScrollView寬度)是超過(guò)屏幕的高度(寬度)的肆捕,但是手機(jī)最終展示給用戶時(shí)的真實(shí)寬高所占的尺寸最多不超過(guò)屏幕的尺寸悬垃。

測(cè)量的寬高

在正確獲得View的寬高前,我們來(lái)分析一下原碼

view.getMeasuredWidth();
view.getMeasuredHeight();

View:getMeasuredWidth();

 public final int getMeasuredWidth() {
        return mMeasuredWidth & MEASURED_SIZE_MASK;
    }

View:getMeasuredHeight();

    public final int getMeasuredHeight() {
        return mMeasuredHeight & MEASURED_SIZE_MASK;
    }

以上返回的是該 View 的原始寬度和高度

查看View對(duì)mMeasuredWidth及mMeasuredHeight的引用發(fā)現(xiàn)setMeasuredDimensionRaw方法對(duì)其進(jìn)行賦值:

private void setMeasuredDimensionRaw(int measuredWidth, int measuredHeight) {
        mMeasuredWidth = measuredWidth;
        mMeasuredHeight = measuredHeight;
        mPrivateFlags |= PFLAG_MEASURED_DIMENSION_SET;
}

回看調(diào)用順序

    protected final void setMeasuredDimension(int measuredWidth, int measuredHeight) {
        boolean optical = isLayoutModeOptical(this);
        if (optical != isLayoutModeOptical(mParent)) {
            Insets insets = getOpticalInsets();
            int opticalWidth  = insets.left + insets.right;
            int opticalHeight = insets.top  + insets.bottom;
            measuredWidth  += optical ? opticalWidth  : -opticalWidth;
            measuredHeight += optical ? opticalHeight : -opticalHeight;
        }
        setMeasuredDimensionRaw(measuredWidth, measuredHeight);
    }
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),
                getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
    }

以上這里看到了熟悉的方法onMeasure() ;

小結(jié):如果想得到measuredWidth 及measuredHeight 要調(diào)用 onMeasure() 即:measure()

真實(shí)的寬高

view.getWidth();
view.getHeight();

View:getWidth();

    public final int getWidth() {
        return mRight - mLeft;
    }

View.getHeight();

    public final int getHeight() {
        return mBottom - mTop;
    }

以上涉及到四個(gè)變量不難看出為View的坐標(biāo)

同樣的方法找到幾個(gè)相應(yīng)的方法

public final void setLeft(int left) {
        ...
        mLeft = left;
        ...
}
public final void setRight(int right) {
        ...
        mRight = right;
        ...
}

public final void setTop(int top) {
        ...
        mTop = top;
        ...
}

public final void setBottom(int bottom) {
        ...
        mBottom = bottom;
        ...
}

細(xì)心的朋友已經(jīng)發(fā)現(xiàn)以上方法為final的
而且查看注釋發(fā)現(xiàn):
This method is meant to be called by the layout system and should not generally be called otherwise, because the property may be changed at any time by the layout.
簡(jiǎn)單說(shuō)就是該方法應(yīng)由布局系統(tǒng)調(diào)用茬祷,不能隨便調(diào)用

繼續(xù)找發(fā)現(xiàn):


    protected boolean setFrame(int left, int top, int right, int bottom) {
            ...
            mLeft = left;
            mTop = top;
            mRight = right;
            mBottom = bottom;
            ...
    }
    /**
     * Same as setFrame, but public and hidden. For use in {@link android.transition.ChangeBounds}.
     * @hide
     */
    //與setFrame相同, 但是@hide被隱藏
    public void setLeftTopRightBottom(int left, int top, int right, int bottom) {
        setFrame(left, top, right, bottom);
    }

public void layout(int l, int t, int r, int b) {
        ...
        boolean changed = isLayoutModeOptical(mParent) ? setOpticalFrame(l, t, r, b) : setFrame(l, t, r, b);
        ...
}
    //最終還是調(diào)用的setFrame()方法
    private boolean setOpticalFrame(int left, int top, int right, int bottom) {
        Insets parentInsets = mParent instanceof View ?
                ((View) mParent).getOpticalInsets() : Insets.NONE;
        Insets childInsets = getOpticalInsets();
        return setFrame(
                left   + parentInsets.left - childInsets.left,
                top    + parentInsets.top  - childInsets.top,
                right  + parentInsets.left + childInsets.right,
                bottom + parentInsets.top  + childInsets.bottom);
    }

以上又看到我們熟悉的方法

要獲得View的真實(shí)寬高,需要調(diào)用 layout()

總結(jié):

getWidth(): View在設(shè)定好布局后的寬墓塌。
getMeasuredWidth(): 對(duì)View測(cè)量后得到的測(cè)量寬度

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市奥额,隨后出現(xiàn)的幾起案子苫幢,更是在濱河造成了極大的恐慌,老刑警劉巖垫挨,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件韩肝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡九榔,警方通過(guò)查閱死者的電腦和手機(jī)哀峻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)哲泊,“玉大人剩蟀,你說(shuō)我怎么就攤上這事∏型” “怎么了育特?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)先朦。 經(jīng)常有香客問(wèn)我缰冤,道長(zhǎng),這世上最難降的妖魔是什么喳魏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任棉浸,我火速辦了婚禮,結(jié)果婚禮上刺彩,老公的妹妹穿的比我還像新娘迷郑。我一直安慰自己,他們只是感情好创倔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布三热。 她就那樣靜靜地躺著,像睡著了一般三幻。 火紅的嫁衣襯著肌膚如雪就漾。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天念搬,我揣著相機(jī)與錄音抑堡,去河邊找鬼摆出。 笑死,一個(gè)胖子當(dāng)著我的面吹牛首妖,可吹牛的內(nèi)容都是我干的偎漫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼有缆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼象踊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起棚壁,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤杯矩,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后袖外,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體史隆,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年曼验,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泌射。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鬓照,死狀恐怖熔酷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情豺裆,我是刑警寧澤拒秘,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站留储,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏咙轩。R本人自食惡果不足惜获讳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望活喊。 院中可真熱鬧丐膝,春花似錦、人聲如沸钾菊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)煞烫。三九已至浑此,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滞详,已是汗流浹背凛俱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工紊馏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蒲犬。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓朱监,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親原叮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赫编,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容