2021SC@SDUSC
layout/engine
Hippy.h
预定义了若干函数,引用了HPNode.h
,被Hippy.cpp
引用,将其中预定义的函数进行实现
具体代码不再列出
Hippy.cpp
实现了Node
的各项参数的setter
和getter
方法,具体代码不再列出
HPLayoutCache.h
定义了一个结构体MeasureResult
,一个常量MAX_MEASURES_COUNT
= 6,一个类HPLayoutCache
,其中预定义了一些函数由HPLayoutCache.cpp
引用并实现
HPLayoutCache.cpp
引用了HPLayoutCache.h
和HPUtil.h
,对其中预定义的一些内容进行了实现,大致是实现一些判断参数是否未定义,是否可以使用之类的功能,以及一些getter
方法和初始化方法
HPNode.h
引用了Flex.h
,FlexLine.h
,HPLayoutCache.h
,HPStyle.h
,HPUtil.h
通过引用这些头文件中定义的一些函数和参数来预定义了一个HPNode
类
供HPNode.cpp
引用
HPNode.cpp
本cpp文件的代码量有1500行,只截取其中部分进行分析,整体上是对Flex布局
中的Node
的复现
void HPNode::resetLayoutRecursive(bool isDisplayNone) {
if (inInitailState && isDisplayNone) {
return;
}
initLayoutResult();
if (!isDisplayNone) { // see HPNode::removeChild
// set result as undefined.see HPNodeChildTest.cpp
// 将结果设置为 undefined.see 在HPNodeChildTest.cpp可查
// in tests/folder
result.dim[DimWidth] = VALUE_UNDEFINED;
result.dim[DimHeight] = VALUE_UNDEFINED;
} else {
inInitailState = true;
// prevent resetLayoutRecursive run many times in recursive
// 防止 resetLayoutRecursive 在递归中运行多次
// in DisplayNone state, set hasNewLayout as true;
// 在 DisplayNone 状态下,将 hasNewLayout 设置为 true;
// set dirty false;
// 把dirty设置为false;
setHasNewLayout(true);
setDirty(false);
}
// if just because parent's display type change,
// 如果只是因为父母的显示类型改变,
// not to clear child layout cache, can be reused.
// 不清除子布局缓存,可以重复使用。
layoutCache.clearCache();
for (size_t i = 0; i < children.size(); i++) {
HPNodeRef item = children[i];
item->resetLayoutRecursive(isDisplayNone);
}
}
void HPNode::setDirty(bool dirtyOrNot) {
if (isDirty == dirtyOrNot) {
return;
}
isDirty = dirtyOrNot;
if (isDirty) {
// reset layout direction to initial state
// 将布局方向重置为初始状态
// need to calculated again
// 需要重新计算
setLayoutDirection(DirectionInherit);
// if is dirty, reset frozen.
// 如果是dirty的,重置冻结。
isFrozen = false;
// if is dirty, layout cache muse be in clear state.
// 如果是dirty的,布局缓存必须处于clear状态。
layoutCache.clearCache();
if (dirtiedFunc != nullptr) {
dirtiedFunc(this);
}
}
}
// calculate main axis by refer this node's flex direction
// 参照该节点的弯曲方向计算主轴
// and layout direction which resolved in resolveDirection.
// 和在 resolveDirection 中解析的布局方向。
FlexDirection HPNode::resolveMainAxis() {
FlexDirection mainAxis = style.flexDirection;
HPDirection direction = getLayoutDirection();
if (direction == DirectionRTL) {
if (mainAxis == FLexDirectionRow) {
return FLexDirectionRowReverse;
} else if (mainAxis == FLexDirectionRowReverse) {
return FLexDirectionRow;
}
}
return mainAxis;
}
HPNode.cpp
的剩余部分留待以后解析