在这里插入图片描述

案例概述

交错网格布局(Staggered Grid)是一种常见的网格布局方式,适合展示不同尺寸的内容。与普通网格不同,交错网格允许不同的行和列跨度。本案例展示了如何创建各种交错网格布局。

核心概念

1. 网格布局基础

网格布局通过行和列组织内容。交错网格允许每个项目占据不同数量的行和列,创建视觉上更有趣的布局。

2. 响应式网格

根据屏幕大小动态调整网格的列数和项目大小。

3. 性能优化

使用 ListView.builder 或 GridView.builder 实现虚拟化,只渲染可见的项目。

代码详解

示例 1:基础交错网格

class BasicStaggeredGridExample extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return GridView.count(
      crossAxisCount: 2,
      children: List.generate(6, (index) {
        final height = index % 2 == 0 ? 200.0 : 150.0;
        return Container(
          color: Colors.primaries[index % Colors.primaries.length],
          height: height,
          child: Center(
            child: Text('项目 $index'),
          ),
        );
      }),
    );
  }
}

代码解释: 这个示例展示了基础的网格布局。通过 GridView.count 创建固定列数的网格。每个项目的高度不同,创建交错效果。

示例 2:三列交错网格

class ThreeColumnStaggeredExample extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return GridView.count(
      crossAxisCount: 3,
      childAspectRatio: 0.8,
      children: List.generate(9, (index) {
        return Container(
          color: Colors.primaries[index % Colors.primaries.length],
          child: Center(
            child: Text('项目 $index'),
          ),
        );
      }),
    );
  }
}

代码解释: 这个示例展示了三列网格布局。通过 childAspectRatio 控制项目的宽高比。

示例 3:响应式交错网格

class ResponsiveStaggeredExample extends StatelessWidget {
  
  Widget build(BuildContext context) {
    final screenWidth = MediaQuery.of(context).size.width;
    final crossAxisCount = screenWidth > 600 ? 3 : 2;

    return GridView.count(
      crossAxisCount: crossAxisCount,
      children: List.generate(12, (index) {
        return Container(
          color: Colors.primaries[index % Colors.primaries.length],
          child: Center(
            child: Text('项目 $index'),
          ),
        );
      }),
    );
  }
}

代码解释: 这个示例展示了响应式网格。根据屏幕宽度动态调整列数。

示例 4:卡片交错网格

class CardStaggeredExample extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return GridView.count(
      crossAxisCount: 2,
      children: List.generate(8, (index) {
        return Card(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Container(
                color: Colors.primaries[index % Colors.primaries.length],
                height: 150,
                width: double.infinity,
              ),
              Padding(
                padding: const EdgeInsets.all(8),
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Text('标题 $index'),
                    const SizedBox(height: 4),
                    Text('描述文本'),
                  ],
                ),
              ),
            ],
          ),
        );
      }),
    );
  }
}

代码解释: 这个示例展示了卡片式的网格布局。每个项目是一个卡片,包含图片和文本。

示例 5:图片交错网格

class ImageStaggeredExample extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return GridView.builder(
      gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisCount: 2,
        crossAxisSpacing: 8,
        mainAxisSpacing: 8,
      ),
      itemCount: 20,
      itemBuilder: (context, index) {
        return Container(
          decoration: BoxDecoration(
            color: Colors.primaries[index % Colors.primaries.length],
            borderRadius: BorderRadius.circular(8),
          ),
          child: Center(
            child: Text('图片 $index'),
          ),
        );
      },
    );
  }
}

代码解释: 这个示例展示了使用 GridView.builder 创建高效的网格。通过 itemBuilder 只渲染可见的项目。

高级话题

1. 动态/响应式设计

根据屏幕大小动态调整网格布局。

2. 动画与过渡

添加项目进入/退出的动画。

3. 搜索/过滤/排序

过滤网格项目。

4. 选择与批量操作

支持选择多个项目。

5. 加载与缓存

虚拟化加载,缓存已加载的项目。

6. 键盘导航

支持键盘导航网格。

7. 无障碍支持

提供无障碍支持。

8. 样式自定义

自定义网格项目的样式。

9. 数据持久化/导出

保存网格状态。

10. 单元测试与集成测试

测试网格布局。

PC 端适配要点

  • 根据屏幕宽度调整列数
  • 支持鼠标悬停效果
  • 提供清晰的项目指示

实际应用场景

  • 图片库:展示图片集合
  • 商品列表:展示商品
  • 文章列表:展示文章摘要
  • 应用市场:展示应用

扩展建议

  • 学习高级网格布局库
  • 研究性能优化技巧
  • 探索自定义网格布局
  • 集成动画库

总结

交错网格布局是展示多种内容的强大方式。通过灵活使用 GridView,可以创建各种网格布局。理解响应式设计和性能优化是关键。

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐