Textview的方法onMeasure

onMeasure

 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);

此處調(diào)用了MeasureSpec類下的getMode和getSize
MODE_MASK屬性等于0x3 << 30;
即二進(jìn)制的3左移30位11 00 0000 0000 0000 0000 0000 0000 0000
&運(yùn)算符將兩個(gè)值轉(zhuǎn)化二進(jìn)制,而后進(jìn)行比較,同1得1,非1和同0則位數(shù)為0
例如3為0011 4為0100 則對(duì)比可得0000 結(jié)果為0 而2為0010 與3對(duì)比可得0010 結(jié)果為2

getMode用于確定類型

public static int getMode(int measureSpec) {
        //noinspection ResourceType
        return (measureSpec & MODE_MASK);
       //返回傳入值與11 00 0000 0000 0000 0000 0000 0000 0000進(jìn)行與運(yùn)算結(jié)果
    }

getSize用于確定大小

public static int getSize(int measureSpec) {
        return (measureSpec & ~MODE_MASK);
       //返回傳入值對(duì)MODE_MASK取反的結(jié)果進(jìn)行與運(yùn)算
    }

之后調(diào)用BoringLayout.Metrics創(chuàng)建對(duì)象,此類負(fù)責(zé)對(duì)普通文本進(jìn)行繪制

       UNKNOWN_BORING=new BoringLayout.Metrics();
        BoringLayout.Metrics boring = UNKNOWN_BORING;
        BoringLayout.Metrics hintBoring = UNKNOWN_BORING;

此后獲得一個(gè)TextDirectionHeuristic對(duì)象,在獲取最大寬度的限制值,判斷是否為精確模式

        if (mTextDir == null) { mTextDir = getTextDirectionHeuristic();  }
        //文字的排序
        final float widthLimit = (widthMode == MeasureSpec.AT_MOST)?  (float) widthSize : Float.MAX_VALUE;
         //AT_MOSE=2<<30也表示為warp模式,如果是warp模式,那么采用本身的寬
        //不是則采用float最大值,這里只是暫時(shí)定為float最大值,后續(xù)還會(huì)做更多判斷
        if (widthMode == MeasureSpec.EXACTLY) { width = widthSize;}
       //精確模式下,將寬等于widthSize
      if (mLayout != null && mEllipsize == null) {
                des = desired(mLayout);//行數(shù)不為空是調(diào)用,dew=-1表示行數(shù)大于1行
            }
            if (des < 0) {
                boring = BoringLayout.isBoring(mTransformed, mTextPaint, mTextDir, mBoring);
                if (boring != null) {
                    mBoring = boring;
                }//<0就是-1行數(shù)大于1然后判斷邊界值,將mBoring變成邊界值
            } else {
                fromexisting = true;
            }
            if (boring == null || boring == UNKNOWN_BORING) {
               //邊界值為空或邊界值還是初始化的狀態(tài)
                if (des < 0) {
                    des = (int) Math.ceil(Layout.getDesiredWidthWithLimit(mTransformed, 0,
                            mTransformed.length(), mTextPaint, mTextDir, widthLimit));
                    //
                }
                width = des;
            } else {
                width = boring.width;
            }

此后判斷初始化hint的寬度不贅述
EMS模式下表示寬度會(huì)根據(jù)行高與寬度共同決定
mMaxWidth * getLineHeight()
此后調(diào)用了makeNewLayout()方法暫時(shí)略過
然后判斷高度,也和此前大致相仿。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容