android自訂view–應該注意的
來源:互聯網
上載者:User
android的布局分兩個階段,先measure()後requestLayout(), 一個MeasureSpec封裝了父布局傳給子布局的布局要求。每個MeasureSpec代表了一個寬度或高度的要求。一個MeasureSpec包含一個尺寸和模式。MeasureSpec的三種模式: UNSPECIFIED:父布局沒有給子布局任何限制,子布局可以任意大小。EXACTLY:父布局決定子布局的確切大小。不論子布局多大,它都必須限制在這個界限裡。AT_MOST:子布局可以根據自己的大小選擇任意大小。@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; }CreationConstructors onFinishInflate()當View和它的所有子物件從XML中匯入之後,調用此方法LayoutonMeasure(int, int)View會調用此方法,來確認自己及所有子物件的大小onLayout(boolean, int, int, int, int, int, int)當View要為所有子物件分配大小和位置時,調用此方法onSizeChanged(int, int, int, int)當View大小改變時,調用此方法DrawingonDraw(Canvas)當View要繪製它的內容時,調用此方法Event processingonKeyDown(int, KeyEvent)當一個新的按鍵事件發生時,調用此方法onKeyUp(int, KeyEvent)當一個按鍵釋放事件發生時,調用此方法onMotionEvent(MotionEvent)當一個動作事件(如觸摸)發生時,調用此方法FocusonFocusChanged(boolean, int)當View獲得或失去焦點時,調用此方法AttachingonAttachedToWindow()當View附加到一個表單上時,調用此方法onDetachedFromWindow()當View離開它的表單時,調用此方法當你為一個 activty 添加一個可見的 view, 並且運行這個activty時,android通常情況下會自動按照下列順序來觸發view的相關事件onAttachedToWindowonMeasureonSizeChangedonLayoutonDraw