android的布局分兩個階段,先measure()后requestLayout(),
一個MeasureSpec封裝了父布局傳給子布局的布局要求。每個MeasureSpec代表了一個寬度或高度的要求。一個MeasureSpec包含一個尺寸和模式。
MeasureSpec的三種模式:
UNSPECIFIED:父布局沒有給子布局任何限制,子布局可以任意大小。
EXACTLY:父布局決定子布局的確切大小。不論子布局多大,它都必須限制在這個界限里。
AT_MOST:子布局可以根據(jù)自己的大小選擇任意大小。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int measuredHeight = measureHeight(heightMeasureSpec);
int measuredWidth = measureWidth(widthMeasureSpec);
setMeasuredDimension(measuredHeight, measuredWidth);
//final DisplayMetrics metrics = getResources().getDisplayMetrics();
//setMeasuredDimension(mBitmap.getScaledWidth(metrics),mBitmap.getScaledHeight(metrics));
}
private int measureHeight(int measureSpec) {
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
int result = 500;
if (specMode == MeasureSpec.AT_MOST)
{
result = specSize;
}
else if (specMode == MeasureSpec.EXACTLY)
{
result = specSize;
}
return result;
}
private int measureWidth(int measureSpec) {
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
int result = 500;
if (specMode == MeasureSpec.AT_MOST)
{
result = specSize;
}
else if (specMode == MeasureSpec.EXACTLY)
{
result = specSize;
}
return result;
}
Creation
Constructors
onFinishInflate() 當(dāng)View和它的所有子對象從XML中導(dǎo)入之后,調(diào)用此方法
Layout
onMeasure(int, int) View會調(diào)用此方法,來確認(rèn)自己及所有子對象的大小
onLayout(boolean, int, int, int, int, int, int) 當(dāng)View要為所有子對象分配大小和位置時,調(diào)用此方法
onSizeChanged(int, int, int, int) 當(dāng)View大小改變時,調(diào)用此方法
Drawing
onDraw(Canvas) 當(dāng)View要繪制它的內(nèi)容時,調(diào)用此方法
Event processing
onKeyDown(int, KeyEvent) 當(dāng)一個新的按鍵事件發(fā)生時,調(diào)用此方法
onKeyUp(int, KeyEvent) 當(dāng)一個按鍵釋放事件發(fā)生時,調(diào)用此方法
onMotionEvent(MotionEvent) 當(dāng)一個動作事件(如觸摸)發(fā)生時,調(diào)用此方法
Focus
onFocusChanged(boolean, int) 當(dāng)View獲得或失去焦點(diǎn)時,調(diào)用此方法
Attaching
onAttachedToWindow() 當(dāng)View附加到一個窗體上時,調(diào)用此方法
onDetachedFromWindow() 當(dāng)View離開它的窗體時,調(diào)用此方法
當(dāng)你為一個 activty 添加一個可見的 view, 并且運(yùn)行這個activty時,android通常情況下會自動按照下列順序來觸發(fā)view的相關(guān)事件
onAttachedToWindow
onMeasure
onSizeChanged
onLayout
onDraw