編輯:關於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觸摸事件機制
當我們的手指在Android屏幕上點擊或滑動時,就會觸發觸摸事件TouchEvent。在App中ViewGroup和View存在多級嵌套,在最外層的是Activity,最
android studio 使用checkstyle全攻略
步驟:1.https://github.com/android/platform_development/blob/master/ide/intellij/codesty
Android制作簡單的普通購物車
本文實例為大家分享了Android普通購物車制作過程,供大家參考,具體內容如下1.最新項目新增了類似購物車功能,如下圖所示:當時剛看到此頁面的時候,第一反應是利用 Lis
Android UI設計系列之ImageView實現ProgressBar旋轉效果(1)
提起ProgressBar,想必大家都比較熟悉,使用起來也是比較方便,直接在XML文件中引用,然後添加屬性,運行就OK了,雖然使用ProgressBar很方便但是在我們開