概述
在实现如下图所示可滚动布局效果时,可能会通过[columnStart/columnEnd]对GridItem设置其占有行列数,实现不规则的布局效果。
图1 columnStart/columnEnd实现不规则网格布局
如果遇到如下的使用场景,使用columnStart/columnEnd可能会造成性能问题:
- 删除或拖拽等改变GridItem位置
- 使用scrollToIndex滑动到指定GridItem
Grid中存在大量GridItem,当使用columnStart/columnEnd、rowStart/rowEnd设置GridItem大小,该场景下耗时过长时,应该考虑使用GridLayoutOptions提升性能。使用columnStart/columnEnd、rowStart/rowEnd布局,在scrollToIndex滑动指定Index时,Grid会遍历GridItem去查找位置。而使用GridLayoutOptions布局,在scrollToIndex滑动指定Index时,则是通过计算方式去查找位置,查找GridItem位置效率更高。对此,可以通过GridLayoutOptions布局选项,配合rowsTemplate、columnsTemplate仅设置其中一个的Grid使用,替代通过columnStart/columnEnd控制GridItem占用多列的情况
案例说明
场景示例
下面介绍Grid中使用scrollToIndex滑动到指定位置的场景为例。在案例中采有了columnStart/columnEnd设置了不规则的宫格布局的反例,以及才有GridLayoutOption的正例进行对比,示例代码如下:
反例: 使用columnStart,columnEnd设置GridItem大小。
// 导入性能打点模块
import hiTraceMeter from '@ohos.hiTraceMeter';
@Component
struct TextItem {
@State item: string = "";
build() {
Text(this.item)
.fontSize(16)
.backgroundColor(0xF9CF93)
.width('100%')
.height(80)
.textAlign(TextAlign.Center)
}
aboutToAppear() {
// 结束打点任务
hiTraceMeter.finishTrace("useColumnStartColumnEnd", 1);
}
}
class MyDataSource implements IDataSource {
private dataA