安卓layout源码浅析之——FrameLayout
来源:互联网 发布:巫师3 4g内存优化 编辑:程序博客网 时间:2024/05/21 22:28
一直想研究下安卓各种布局控件,FrameLayout是安卓最简单的界面布局,所以就从FrameLayout讲起。
1.属性。frameLayout继承ViewGroup,除了拥有ViewGroup的属性之外,只有一个layout_gravity属性。看它的内部静态类LayoutParams:
public static class LayoutParams extends MarginLayoutParams { public int gravity = -1;//唯一的属性
2.绘制过程。首先,它会遍历所有子view,并且对每个子view进行measure,并记录下子view的最大宽高,作为自身的尺寸。在这个过程中,如果自身是不确定大小的模式,子view又是MATCH_PARENT属性的,就需要为这些子view重新测绘。
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { (。。。。。。) int maxHeight = 0;//记录最大的宽高 int maxWidth = 0; int childState = 0; for (int i = 0; i < count; i++) { final View child = getChildAt(i); if (mMeasureAllChildren || child.getVisibility() != GONE) { measureChildWithMargins(child, widthMeasureSpec, 0, heightMeasureSpec, 0);//测绘所有子view final LayoutParams lp = (LayoutParams) child.getLayoutParams(); maxWidth = Math.max(maxWidth, child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin); maxHeight = Math.max(maxHeight, child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin); childState = combineMeasuredStates(childState, child.getMeasuredState()); if (measureMatchParentChildren) { if (lp.width == LayoutParams.MATCH_PARENT || lp.height == LayoutParams.MATCH_PARENT) { mMatchParentChildren.add(child);//保存需要重新测绘的子view } } } } (。。。。。。) if (count > 1) { for (int i = 0; i < count; i++) { <pre name="code" class="java" style="font-size: 13.3333px;"> (。。。。。。)child.measure(childWidthMeasureSpec, childHeightMeasureSpec);//重新测绘子view } } }
3.layout过程。FrameLayout对每个子view的layout过程是相同的。它遍历所有子view,通过子view的gravity属性进行xy轴偏移量的计算,最后调用child.layout()对子View进行布局。
void layoutChildren(int left, int top, int right, int bottom, boolean forceLeftGravity) { (。。。。。。) for (int i = 0; i < count; i++) { (。。。。。。) switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) { case Gravity.CENTER_HORIZONTAL: childLeft = parentLeft + (parentRight - parentLeft - width) / 2 + lp.leftMargin - lp.rightMargin; break; case Gravity.RIGHT: if (!forceLeftGravity) { childLeft = parentRight - width - lp.rightMargin; break; } case Gravity.LEFT: default: childLeft = parentLeft + lp.leftMargin; } switch (verticalGravity) { case Gravity.TOP: childTop = parentTop + lp.topMargin; break; case Gravity.CENTER_VERTICAL: childTop = parentTop + (parentBottom - parentTop - height) / 2 + lp.topMargin - lp.bottomMargin; break; case Gravity.BOTTOM: childTop = parentBottom - height - lp.bottomMargin; break; default: childTop = parentTop + lp.topMargin; } child.layout(childLeft, childTop, childLeft + width, childTop + height); } } }
2 0
- 安卓layout源码浅析之——FrameLayout
- android Layout之FrameLayout
- Android———Layout:Framelayout
- 安卓布局之FrameLayout布局
- android5.1 FrameLayout源码浅析
- 安卓AlertDialog源码浅析
- codingke安卓学习之Layout
- 安卓系统源码编译系列(四)——LOCAL_WHOLE_STATIC_LIBRARIES和LOCAL_STATIC_LIBRARIES的区别浅析
- 安卓系统源码编译系列(4)——LOCAL_WHOLE_STATIC_LIBRARIES和LOCAL_STATIC_LIBRARIES的区别浅析
- 安卓系统源码编译系列(4)——LOCAL_WHOLE_STATIC_LIBRARIES和LOCAL_STATIC_LIBRARIES的区别浅析
- 浅析安卓事件分发机制源码
- 安卓日记——利用include和Framelayout搭建app UI框架
- 安卓 View 工作流程-Measure、 Layout、Draw 源码阅读
- 自定义View之Layout浅析
- Android Layout之一:FrameLayout
- Android Layout之一:FrameLayout
- Android Layout:FrameLayout
- Android Layout之一:FrameLayout
- Android学习记录—《第一行代码》阅读笔记(4)
- jsx语法
- 4474: [Jsoi2015]isomorphism
- 一次完整的http请求
- 5.自己动手写Java Web框架-上下文
- 安卓layout源码浅析之——FrameLayout
- Android studio 上非常好用的快捷键
- 非比较排序——计数排序和基数排序
- 【健康贴士】——隐形眼镜的危害,以及正确的佩戴方式
- Python的ORM框架Peewee使用入门(二)
- hrbust 1000 A+B Problem【明天尽力】
- 面对你最难以面对的那些痛
- css最后一部分内容,灰度,滤镜,针对谷歌浏览器
- Android中的CoordinatorLayout初体验