路线详情页布局实现

鸿蒙原生开发手记:徒步迹 - 路线详情页布局实现

构建丰富的路线详情展示页面


一、前言

路线详情页展示路线的完整信息,包括图片、基本数据、途经点、照片墙等。本文实现多 Tab 详情页结构。


二、页面架构

顶部图片区域
    ↓
基本信息卡片(标题、距离、时间等)
    ↓
Tab切换(路线详情 / 沿途照片 / 路书)
    ↓
内容区域(根据Tab切换)

三、核心代码

@Entry
@Component
struct RouteDetailPage {
  @State selectedTab: number = 0;
  @State routeId: number = 0;

  aboutToAppear(): void {
    const params = router.getParams() as Record<string, Object>;
    this.routeId = params['routeId'] as number;
  }

  build() {
    Column() {
      // 顶部图片
      Stack() {
        Column()
          .width('100%').height(220)
          .backgroundColor('#4CAF50');

        Row() {
          Image($r('app.media.app_icon'))
            .width(24).height(24)
            .onClick(() => router.back());
          Text('').layoutWeight(1);
        }
        .width('100%')
        .padding({ left: 16, right: 16, top: 12 });
      }
      .width('100%').height(220);

      // 基本信息卡片
      this.InfoCard();

      // Tab 切换栏
      this.TabBar();

      // 内容区域
      this.TabContent();
    }
    .width('100%').height('100%')
    .backgroundColor('#F5F5F5');
  }

  @Builder
  InfoCard() {
    Column() {
      Text('徒步路线')
        .fontSize(22).fontWeight(FontWeight.Bold);
      Text('这是一条风景优美的徒步路线')
        .fontSize(14).fontColor('#666').margin({ top: 6 });
      Row() {
        Text('长度: 5km').fontSize(13).fontColor('#666');
        Text('耗时: 2h').fontSize(13).fontColor('#666').margin({ left: 16 });
        Text('爬升: 300m').fontSize(13).fontColor('#666').margin({ left: 16 });
      }
      .margin({ top: 10 });
    }
    .width('100%').padding(16)
    .backgroundColor('#FFF')
    .borderRadius({ topLeft: 20, topRight: 20 })
    .margin({ top: -20 });
  }

  @Builder
  TabBar() {
    Row() {
      this.TabItem('路线详情', 0);
      this.TabItem('沿途照片', 1);
      this.TabItem('路书', 2);
    }
    .padding({ left: 16, right: 16 })
    .backgroundColor('#FFF');
  }

  @Builder
  TabItem(label: string, index: number) {
    Column() {
      Text(label)
        .fontSize(14)
        .fontColor(this.selectedTab === index ? '#4CAF50' : '#666')
        .fontWeight(this.selectedTab === index ? FontWeight.Medium : FontWeight.Normal);
      Divider()
        .width('50%').height(2)
        .color(this.selectedTab === index ? '#4CAF50' : Color.Transparent)
        .margin({ top: 8 });
    }
    .layoutWeight(1)
    .padding({ top: 8, bottom: 4 })
    .alignItems(HorizontalAlign.Center)
    .onClick(() => { this.selectedTab = index; });
  }

四、总结

详情页的多 Tab 设计合理组织了大量信息,使用 @Builder 拆分组件让代码结构清晰。配图区、文字区、数据区的组合是徒步路线详情页的典型布局。

下一篇文章将实现海拔折线图的绘制。


下一篇预告:鸿蒙原生开发手记:徒步迹 - 海拔折线图自定义绘制

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐