直播间超复杂布局,用包含关系实现布局文件的“继承”

最近开始准备找工作,打算把之前做的一些重构、优化相关的东西整理整理。

MeMe Live的直播间以前在运行时,有高达2000多个View,非常庞大、臃肿,维护起来及其空难,很容易牵一发而动全身,新招进来的同学很难驾驭。于是对它进行了重构。顺便说一句,以前的布局是用的RelativeLayout,性能差不说,还很不灵活。重构时将其改成了ConstraintLayout,每一个相关的View都得转换,每一个在Java代码中硬编码调整属性的控件都得找出来,改掉。工程量和困难度可想而知,索性最后坚持坐下来了。收获不少,对团队开发效率也提升不少。

一、分离布局

从原来的大杂烩布局文件:
activity_audience_land.xml
activity_audience_port.xml
activity_cast.xml
分离出来

  1. 观众横屏:include_audience_core_land.xml
  2. 观众竖屏:include_audience_core_portrait.xml
  3. 主播:include_cast_core.xml

三个核心布局文件。

二、按照属性分别将三个核心布局划分为:

【左、上、右、下、中P300、中P200、float、legacy、under、constraint】
其中,P[XXX],代表层次优先级,目前定义的优先级有P300、P200。P300<P200<P100。可按照这样的优先级来组
织层次的遮挡关系。
float:代表浮层;
legacy:代表该改为弹窗的嵌入式view,后续重构过程会改掉它们;
under:代表在最底层的,会被所有是覆盖;
constant:代表约束相关,如space、guide、屏障等不可见的控件。

三、命名规则


通过嵌入的方式实现在布局文件中的“继承”关系,命名规则为:
[属性][横屏/竖屏/公共][主播/观众]
以左侧布局为例,
公共:merge_live_room_layer_left_common.xml
横屏观众:merge_live_room_layer_left_land_audience.xml
竖屏:merge_live_room_layer_left_portrait.xml
竖屏观众:merge_live_room_layer_left_portrait_audience.xml
竖屏主播:merge_live_room_layer_left_portrait_caster.xml
“继承”关系为:
竖屏观众——「继承」—–>竖屏——「继承」——->公共;
竖屏主播——「继承」—–>竖屏——「继承」—–>公共;
横屏观众——「继承」—–>公共;

四、注意事项

后期往直播间添加布局时,先确认该控件的位置,即左上右下中。其次,确认该控件是否为横竖、主播都有的,如果
是,则写在对应的common中。同时,确认其样式在观众、主播端是否相同,否则进行相应 caster、audience区分。
可参考【三、命名规则】中的例子

逻辑结构图: