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í)略過
然后判斷高度,也和此前大致相仿。