列表中复制UI元素(附有动画)并同时复制动画问题和杨帆讨论的2套方案:
1.列表子元素,子元素动画与列表界面在同一UI文件中(宋胜磊):
TimeLine:对应一个元素的完整动画的全部数据,
TimeLine里的多种类型Frame则是动画关键帧。
元素根据不同动画表现形式有多种存储动画数据的TimeLine分别包含多种动画类型的Frame数据-旋转,缩放,位置,颜色,显示等
这多种Frame继承自一个Frame接口。
在cocos读取到这些数据后,根据TimeLine以及Frames以及Frames里的node(ui元素)执行动画。
拷贝动画就要保证这三项数据无误。TimeLine,Frames,以及运行时node。
TimeLine里有FramesVector存储全部Frame,runAction之后可以设置Frame里对应node元素。
问题在于在拷贝对应TimeLine(根据ActionTag可以找到元素对应的TimeLine)里的Frames(Vector<接口>)时无法获知该Frame是何种类型的Frame。
不同Frame的成员函授不同,不可能在ColorFrame中调用PositionFrame才有的getX获取动画的起始点。
得不到作为默认元素的坐标就无法设置clone自它的新的元素的坐标。
虽然在符合一些特殊条件的关键帧数据(比如只改变透明度,没有位置,旋转等变动),根据默认元素的动画数据拷贝可以达到想要的全部拷贝效果。但这点在ListView中成功,在GridView上也失败。具体原因暂未找到。从以上分析测试得出,这种在内存里根据列表默认子元素的动画数据设置新的子元素的动画数据的方式,不可行。
2.把列表子元素以及元素动画分割出来单独作为一个csb文件,和列表并不在同一文件(杨帆)。
这种做法每个列表子元素都读取csb新建元素createNode,并新建动画createTimeline,然后node添加进去列表,动画统一播放,
因为不涉及到元素与元素,元素动画与元素动画之间的相对属性(主要是位置,新建的元素的坐标系和动画的坐标系是一致的),
从csb读取出来就不需要再在内存里重新设置。该方法可行。以上两种效率问题暂未考虑。
综上所述:如果你要在你的游戏中实现比如英雄卡牌列表中单个卡牌的动画,然后再所有列表中显示该动画,那么需要做的就是重新在一个csd文件中新建该卡牌的动画,而不是把它和列表UI做在同一个文件中。