編輯:關於Android編程
本篇模擬三個角色:Android 架構師-小福、Android 控件開發工程師-小黑、 Android 開發工程師-小白,下面按照三個角色不同角度分析measure過程。
小福負責分享:
measure的本質 measure代碼流程 onMeasure方法與MeasureSpec 提出問題
public final class ViewRootImpl extends Handler implements ViewParent, View.AttachInfo.Callbacks, HardwareRenderer.HardwareDrawCallbacks { // 1 所有子視圖的requestLayout方法,最總都會觸發根視圖此方法 public void requestLayout() { checkThread(); // 需要重新布局 mLayoutRequested = true; scheduleTraversals(); } // 調度遍歷 public void scheduleTraversals() { if (!mTraversalScheduled) { mTraversalScheduled = true; ..... // 當前類繼承自Handler,發出一個空消息,目的是加入Message隊列 sendEmptyMessage(DO_TRAVERSAL); } } @Override public void handleMessage(Message msg) { switch (msg.what) { ... case DO_TRAVERSAL: ... // 處理DO_TRAVERSAL消息 performTraversals(); ... break; ..... } } // 執行遍歷 private void performTraversals() { final View host = mView; int desiredWindowWidth; int desiredWindowHeight; int childWidthMeasureSpec; int childHeightMeasureSpec; ...... if (mLayoutRequested && !mStopped) { ...... childWidthMeasureSpec = getRootMeasureSpec(desiredWindowWidth, lp.width); childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height); ...... // host是一個View對象 host.measure(childWidthMeasureSpec, childHeightMeasureSpec); ...... } ...... } }
接著上面的measure流程的第五步走下去,以下是android.view.View.java文件中的源碼:
public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Callback, AccessibilityEventSource { // 方法是final類型,說明不能被覆寫或者重載 public final void measure(int widthMeasureSpec, int heightMeasureSpec) { // 如果有重新請求標志,或者寬高發生改變 if ((mPrivateFlags & FORCE_LAYOUT) == FORCE_LAYOUT || widthMeasureSpec != mOldWidthMeasureSpec || heightMeasureSpec != mOldHeightMeasureSpec) { ...... // 真正執行測量視圖大小操作 // measure ourselves, this should set the measured dimension flag back onMeasure(widthMeasureSpec, heightMeasureSpec); ...... // 添加重新請求子視圖布局標志 mPrivateFlags |= LAYOUT_REQUIRED; } ...... } /** * Call this when something has changed which has invalidated the * layout of this view. This will schedule a layout pass of the view * tree. */ public void requestLayout() { if (ViewDebug.TRACE_HIERARCHY) { ViewDebug.trace(this, ViewDebug.HierarchyTraceType.REQUEST_LAYOUT); } // 添加重新請求布局標志 mPrivateFlags |= FORCE_LAYOUT; mPrivateFlags |= INVALIDATED; if (mParent != null) { if (mLayoutParams != null) { mLayoutParams.resolveWithDirection(getResolvedLayoutDirection()); } if (!mParent.isLayoutRequested()) { mParent.requestLayout(); } } } }
上面代碼的measure流程可以分為4個步驟
1 measure與requestLayout -> 2 onMeasure
緊接著看下android.widget.FrameLayout類的onMeasure總都做了什麼?
當我們的手指在Android屏幕上點擊或滑動時,就會觸發觸摸事件TouchEvent。在App中ViewGroup和View存在多級嵌套,在最外層的是Activity,最
步驟:1.https://github.com/android/platform_development/blob/master/ide/intellij/codesty
本文實例為大家分享了Android普通購物車制作過程,供大家參考,具體內容如下1.最新項目新增了類似購物車功能,如下圖所示:當時剛看到此頁面的時候,第一反應是利用 Lis
提起ProgressBar,想必大家都比較熟悉,使用起來也是比較方便,直接在XML文件中引用,然後添加屬性,運行就OK了,雖然使用ProgressBar很方便但是在我們開