019.View的layout过程
来源:互联网 发布:收集区域手机号码软件 编辑:程序博客网 时间:2024/06/05 16:54
View的Layout过程,也就是布局子元素的过程,ViewGroup通过这个过程来确定子元素的位置,当ViewGroup的位置被确定了以后,就会在onLayout中遍历所有的子元素并且调用这些元素的layout方法,在layout方法中onLayout方法会被回调.下面我们从View的Layout方法开始看:
public void layout(int l, int t, int r, int b) { if ((mPrivateFlags3 & PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT) != 0) { onMeasure(mOldWidthMeasureSpec, mOldHeightMeasureSpec); mPrivateFlags3 &= ~PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT; } //首先,在layout的时候,我们已经拿到了View的位置了,然后,我们记录下之前的View的位置信息。 int oldL = mLeft; int oldT = mTop; int oldB = mBottom; int oldR = mRight; //isLayoutModeOptical返回为true需要mParent为ViewGroup派生类的对象, //并且mParent的isLayoutModeOptical也需要是true,一般来说,只要layoutMode不是LAYOUT_MODE_OPTICAL_BOUNDS //那么,什么叫LAYOUT_MODE_OPTICAL_BOUNDS ?一般我们绘制了View的阴影、发光区域什么的,这种情况下,我们会有个区域影响到别的控件 //下面主要讲setFrame ,setFrame的最终结果就是重新设置View的位置,并且返回是否改变了View的位置。 boolean changed = isLayoutModeOptical(mParent) ? setOpticalFrame(l, t, r, b) : setFrame(l, t, r, b); if (changed || (mPrivateFlags & PFLAG_LAYOUT_REQUIRED) == PFLAG_LAYOUT_REQUIRED) { //执行onLayout的方法,当然,也是遍历子View,每个都要告诉ViewGroup onLayout(changed, l, t, r, b); mPrivateFlags &= ~PFLAG_LAYOUT_REQUIRED; ListenerInfo li = mListenerInfo; if (li != null && li.mOnLayoutChangeListeners != null) { ArrayList<OnLayoutChangeListener> listenersCopy = (ArrayList<OnLayoutChangeListener>)li.mOnLayoutChangeListeners.clone(); int numListeners = listenersCopy.size(); for (int i = 0; i < numListeners; ++i) { listenersCopy.get(i).onLayoutChange(this, l, t, r, b, oldL, oldT, oldR, oldB); } } } mPrivateFlags &= ~PFLAG_FORCE_LAYOUT; mPrivateFlags3 |= PFLAG3_IS_LAID_OUT; }
0 0
- 019.View的layout过程
- view的layout过程
- view的layout过程
- View的layout过程
- View的布局(layout)过程
- 自定义view的Layout过程
- 【自定义view系列】View的layout过程
- 浅析Android View的Layout过程
- View的Layout过程源码分析
- View的工作流程(layout过程)
- Android应用程序窗口View的layout过程
- View的工作流程-Layout过程
- View 的 layout 和 draw 过程
- View的工作原理之layout过程
- 自定义View Layout过程
- View工作原理(四)view的layout过程
- [置顶] View工作原理(四)view的layout过程
- android-View工作原理(四)view的layout过程
- Android TZ Keymaster
- day02运算及运算符,简单if swith for while dowhile语句数据结构
- MemSQL翻译第一天
- js 删除数组中重复的数组
- handler——Handler详解
- 019.View的layout过程
- 如何使用JSON连接Android和PHP Mysql数据库
- swift(NSOperation 多线程)
- 2个超大数的加法运算
- PAT甲级1008(Java)
- AIDL 进程间通信(IPC)
- Linux yum 命令
- 开博引言 暨 第一篇《iOS中 类与JSON、字典等的转换》
- 在广播中启动Activity,弹出Dialog需要注意的事项