View的工作流程(layout过程)
来源:互联网 发布:mac能玩gta5 编辑:程序博客网 时间:2024/05/22 01:53
layout过程
Layout的作用是ViewGroup用来确定子元素的位置,当ViewGroup位置被确定后,它在onLayout中会遍历所有的子元素并调用其layout方法,在layout方法中onLayout方法又会被调用。layout方法确定本身的位置,而onLayout方法则会确定所有子元素的位置。
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; } int oldL = mLeft; int oldT = mTop; int oldB = mBottom; int oldR = mRight; boolean changed = isLayoutModeOptical(mParent) ? setOpticalFrame(l, t, r, b) : setFrame(l, t, r, b); if (changed || (mPrivateFlags & PFLAG_LAYOUT_REQUIRED) == PFLAG_LAYOUT_REQUIRED) { 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; }
大致流程为:首先会通过setFrame方法来设定View的四个顶点的位置,初始化mLeft、mTop、mBottom、mRight这四个值,View的四个顶点一旦确定,那么View在父容器中的位置也就定了;接着会调用onLayout方法,这个方法的用途是父容器确定子元素的位置,和onMeasure方法类似,onLayout的具体实现同样和具体布局有关,所以View和ViewGroup均没有实现onLayout方法。
View的getMeasuredWidth和getWidth的区别:
在View默认的实现中,View的测量宽高和最终宽高是相等的,只不过测量宽高形成于View的measure过程,而最终宽高形成于View的layout过程。
draw过程
View的绘制过程遵循以下几步:
- 绘制背景background.draw(canvas);
- 绘制自己(onDraw);
- 绘制children(dipatchDraw)
- 绘制装饰(onDrawScrollBars)
View绘制过程的传递是通过dispatchDraw来实现的,dispatchDraw会遍历调用所有子元素的draw方法。View有一个特殊的方法setWillNotDraw。
如果一个View不需要绘制任何内容,那么设置这个标记位为true以后,系统会进行相应的优化。默认情况下,View没有启用这个优化标记位,但是ViewGroup会默认启用这个优化标记位。这个标记位对实际开发的意义是:当我们的自定义控件继承于ViewGroup并且本身不具备绘制功能时,就可以开启这个标记位,从而便于系统进行后续的优化。
- View的工作流程(layout过程)
- View的工作流程-Layout过程
- View的工作原理之layout过程
- View的工作流程-measure、layout、draw三大流程
- View工作原理(四)view的layout过程
- [置顶] View工作原理(四)view的layout过程
- android-View工作原理(四)view的layout过程
- View工作原理(四)view的layout过程
- android-View工作原理(四)view的layout过程
- View的工作流程---Measure过程
- view的layout过程
- view的layout过程
- View的layout过程
- android view的讲解 之 view的工作流程(measure,layout,draw)(二)
- View的绘制流程(三)--------view的layout和draw过程
- View的工作原理(三)--View的Layout和Draw过程
- View的布局(layout)过程
- 019.View的layout过程
- 在W10系统中怎么打开cpu虚拟化设施
- iOS动态调用Get Set
- 两个ListView实现的Android点餐页面
- JUC源码分析1-原子变量-AtomicInteger/AtomicBoolean/AtomicLong/AtomicReference
- 【知识整理】移动端微信页面禁止字体放大
- View的工作流程(layout过程)
- Hive
- Salient Object Detection and Segmentation
- 日志aop方式
- Sqoop
- Python装饰器真的只是语法糖吗?
- hdoj--3530 Subsequence(单调队列)
- Server将表单数据获取并返给Client
- Spring通过实现getBean方法获得Bean的实例