HarmonyOS第一课 05 从简单的页面开始-开发代码2

HarmonyOS2.0 华为鸿蒙开发学习实战教程 据统计,鸿蒙系统升级用户2周破1800万,1个月突破3000万。升级速度完全超出市场预期,很显然,华为严重低估了消费者的支持热情。随即,华为鸿蒙目标多次升级,从2亿到4亿,后年目标12.3亿。 而且,目前国内有很多家软硬件厂商已经加入了鸿蒙。格力董事长董明珠在近日接受外媒采访时表示:格力将引入鸿蒙操作系统。 对应用开发者而言,HarmonyOS采用了多种分布式技术,使得应用程序的开发实现与不同终端设备的形态差异无关,降低了开发难度和成本。这能够让开发者聚焦上层业务逻辑,更加便捷、高效地开发应用。 作为万物互 阅读详情

94b64a76e5aa44c49b4048bd63545f73.png

本文的内容是使用ArkUI继续完成一个简单的页面。上节内容已经完成了上半部分,接下来继续完成下半部分。

页面具体实现如图:

da84d3796f0b401d803a8620d62b78e4.png

下载本节内容的素材。「链接」

8ea6906caae348dab6736a3f2f763c53.png

创建赋能套件

在Index.ets文件中新建控件EnablementItem

需要完成的案例:

426a76c3b78a4744b4ded6fc2298005c.png

EnablementItem布局:

da22a5ce96f54c7687ef1831662c31ed.png

EnablementItem布局代码:

@Preview
@Component
struct EnablementItem{
  private title: string = 'HarmonyOS第一课';
  private brief: string = '基于真实的开发场景,提供向导式学习,多维度融合课程等内容,给开发者提供全新的学习体验。';

  build() {
    Column(){
      /**
       * 使用$r的方式给Image组件设置图片资源,设置图片宽度为100%,即宽度与根容器Column保持一致。

       设置填充效果为cover模式,即保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界。
       */
      Image($r('app.media.enablement_pic1')).width('100%').objectFit(ImageFit.Cover)
        .height(96)
        // 图片圆角边框
        .borderRadius({
          topLeft:16,
          topRight:16
        })

      /*
      接下来给Text组件添加属性,textOverFlow属性设置文本超长时的显示方式,在这里我们设置它的值为Ellipsis,表示超长时使用省略号替代。

maxLines属性设置文本的最大行数,我们设置title最多显示一行,brief最多显示两行。

到这里我们完成了“赋能套件介绍”网格布局Item的创建。
       */
      Text(this.title)
        .height(19)
        .width('100%')
        .fontSize(14)
        .textAlign(TextAlign.Start)
        .textOverflow({ overflow: TextOverflow.Ellipsis })
        .maxLines(1)
        .fontWeight(400)
        .padding({ left: 12, right: 12 })
        .margin({ top: 8 })
      // 第二行文字
      Text(this.brief)
        .height(32)
        .width('100%')
        .fontSize(12)
        .textAlign(TextAlign.Start)
        .textOverflow({ overflow: TextOverflow.Ellipsis })
        .maxLines(2)
        .fontWeight(400)
        .fontColor('rgba(0, 0, 0, 0.6)')
        .padding({ left: 12, right: 12 })
        .margin({ top: 2 })

    }.width(160)
    .height(169)
    .borderRadius(16)
    .backgroundColor(Color.White)
    
  }
}

整个index.ets的代码:

import image from '@ohos.multimedia.image';

// 新建一个Banner类,便于滑动
class BannerClass{
  id:string="";//用于唯一标识每一张图片资源,在之后的ForEach内容中我们会看到其作用
  imgSrc:ResourceStr = ""; //imageSrc属性,用于存储图片地址
  url:string =""; //用于存储Banner图片点击后跳转到的在线网页地址,在之后的跳转功能中会用到。

  // 按住alt+insert键,可以自动生成构造方法
  constructor(id: string, imgSrc: ResourceStr, url: string) {
    this.id = id;
    this.imgSrc = imgSrc;
    this.url = url;
  }
}


@Entry
@Component
struct Index {
  @State message: string = '快速入门';

  build() {
    Column() {
      Text(this.message)
        //.id('HelloWorld') // 这个不需要
        .fontSize(24)
        .fontWeight('700')
        .width("100%")
        .textAlign(TextAlign.Start)
        .padding({"left":16})
        .fontFamily("HarmonyHeiTi-Bold")
        .lineHeight(33)
      // 把Banner放在文字的下面
      Banner()
    }
    .height('100%')
    .width('100%')
    .backgroundColor("#F1F3F5")
  }
}

// 新建一个Banner
@Component
@Preview
struct Banner{

  @State bannerList: Array<BannerClass>=[
    new BannerClass('pic0',$r('app.media.banner_pic0'),'https://developer.huawei.com'),
    new BannerClass('pic1',$r('app.media.banner_pic1'),'https://developer.huawei.com'),
    new BannerClass('pic2',$r('app.media.banner_pic2'),'https://developer.huawei.com'),
    new BannerClass('pic3',$r('app.media.banner_pic3'),'https://developer.huawei.com'),
    new BannerClass('pic4',$r('app.media.banner_pic4'),'https://developer.huawei.com'),
    new BannerClass('pic5',$r('app.media.banner_pic5'),'https://developer.huawei.com')

  ]

  build() {
    // 滑动块,将image包裹起来
    Swiper(){
      
      ForEach(this.bannerList,(item:BannerClass,index:number)=>{
        Image(item.imgSrc).objectFit(ImageFit.Contain)
          .width("100%")
            // 这里能否合并left和right?
          .padding({"left":16,"right":16,"top":11})
            // 圆角边框
          .borderRadius(16)
      },(item:BannerClass,index:number)=>item.id)

    }
    //设置一下Swiper的属性。其中,autoPlay控制是否自动轮播子组件,loop属性控制是否循环播放,
    // indicator属性自定义导航点的位置和样式。
    .autoPlay(true)
    .loop(true)
    .indicator(new DotIndicator().color('#1a000000').selectedColor("#0a59f7"))


  }
}

@Preview
@Component
struct EnablementItem{
  private title: string = 'HarmonyOS第一课';
  private brief: string = '基于真实的开发场景,提供向导式学习,多维度融合课程等内容,给开发者提供全新的学习体验。';

  build() {
    Column(){
      /**
       * 使用$r的方式给Image组件设置图片资源,设置图片宽度为100%,即宽度与根容器Column保持一致。

       设置填充效果为cover模式,即保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界。
       */
      Image($r('app.media.enablement_pic1')).width('100%').objectFit(ImageFit.Cover)
        .height(96)
        // 图片圆角边框
        .borderRadius({
          topLeft:16,
          topRight:16
        })

      /*
      接下来给Text组件添加属性,textOverFlow属性设置文本超长时的显示方式,在这里我们设置它的值为Ellipsis,表示超长时使用省略号替代。

maxLines属性设置文本的最大行数,我们设置title最多显示一行,brief最多显示两行。

到这里我们完成了“赋能套件介绍”网格布局Item的创建。
       */
      Text(this.title)
        .height(19)
        .width('100%')
        .fontSize(14)
        .textAlign(TextAlign.Start)
        .textOverflow({ overflow: TextOverflow.Ellipsis })
        .maxLines(1)
        .fontWeight(400)
        .padding({ left: 12, right: 12 })
        .margin({ top: 8 })
      // 第二行文字
      Text(this.brief)
        .height(32)
        .width('100%')
        .fontSize(12)
        .textAlign(TextAlign.Start)
        .textOverflow({ overflow: TextOverflow.Ellipsis })
        .maxLines(2)
        .fontWeight(400)
        .fontColor('rgba(0, 0, 0, 0.6)')
        .padding({ left: 12, right: 12 })
        .margin({ top: 2 })

    }.width(160)
    .height(169)
    .borderRadius(16)
    .backgroundColor(Color.White)
    
  }
}

创建“入门教程”列表视图Item

需要完成的示例

6872120dc7f742a6a3a114b891270762.png

TutorialItem布局代码

2105d95126e6466fa1d103635921d670.png


@Preview
@Component
struct TutorialItem {
  private title: string = 'Step1 快速入门介绍';
  private brief: string = '本篇教程实现了快速入门——一个用于了解和学习HarmonyOS的应用程序 。';

  build() {
    // TutorialItem 布局代码
    Row() {
      Column() {
        // 这里的两个文本样式有些多余了,不知有没有办法写一个样式,然后套用
        Text(this.title)
          .height(19)
          .width('100%')
          .fontSize(14)
          .textAlign(TextAlign.Start)
          .textOverflow({ overflow: TextOverflow.Ellipsis })
          .maxLines(1)
          .fontWeight(400)
          .margin({ top: 4 })

        Text(this.brief)
          .height(32)
          .width('100%')
          .fontSize(12)
          .textAlign(TextAlign.Start)
          .textOverflow({ overflow: TextOverflow.Ellipsis })
          .maxLines(2)
          .fontWeight(400)
          .fontColor('rgba(0, 0, 0, 0.6)')
          .margin({ top: 5 })
      }
      .height('100%')
      .layoutWeight(1)
      .alignItems(HorizontalAlign.Start)
      .margin({ right: 12 })

      Image($r('app.media.enablement_pic1'))
        .height(64)
        .width(108)
        .objectFit(ImageFit.Cover)
        .borderRadius(16)
    }.width('100%')
    .height(88)
    .borderRadius(16)
    .backgroundColor(Color.White)
    .padding(12)
    .alignItems(VerticalAlign.Top)
  }
}

已经完成了两个单独的组件,接下来需要循环将这些组件显示.

下载多个文件素材「链接」

形成网格和列表

观察单个item视图,可以发现,每一个item是由其文章的对应标题(title)、简介(brief)、文章配图(imageSrc)和点击后即将跳转的网页地址(webUrl)组成的。

0f38f1ddd2184e019b1f8e244ab89644.png

建立命名为EnablementView的空组件和TutorialView的空组件,并用@Preview装饰器装饰,以便单独预览组件。

e5f37a3a4b0b49b88e81a18a8ca1ee8d.png

这里两个控件设计有点复杂,接下来看重点

1,Grid循环,

2,List循环,

在这两个循环中,主要使用了@Prop这个装饰器,将变量传入到对应的组件中,看示例代码

5a84c0e0f2c3438a860dcb5674b33d99.png

bf8e598252844237b9a59a015a4ae161.png

然后另外一个也是一样

a214aa2ac96a40c79d97789cfb6d05de.png

9f901a47ea024aa2855c28c9d192d2b0.png

主要就是这两处代码.其余完整的index.ets代码如下:

import image from '@ohos.multimedia.image';

// 新建一个Banner类,便于滑动
class BannerClass{
  id:string="";//用于唯一标识每一张图片资源,在之后的ForEach内容中我们会看到其作用
  imgSrc:ResourceStr = ""; //imageSrc属性,用于存储图片地址
  url:string =""; //用于存储Banner图片点击后跳转到的在线网页地址,在之后的跳转功能中会用到。

  // 按住alt+insert键,可以自动生成构造方法
  constructor(id: string, imgSrc: ResourceStr, url: string) {
    this.id = id;
    this.imgSrc = imgSrc;
    this.url = url;
  }
}

/*
文章的数据结构。在数据结构内为每个文章定义唯一id,并添加其标题(title)、简介(brief)、文章配图(imageSrc)和点击后即将跳转的网页地址(webUrl)属性。
 */
class ArticleClass {
  id: string = '';
  imageSrc: ResourceStr = '';
  title: string = '';
  brief: string = '';
  webUrl: string = '';

  constructor(id: string, imageSrc: ResourceStr, title: string, brief: string, webUrl: string) {
    this.id = id;
    this.imageSrc = imageSrc;
    this.title = title;
    this.brief = brief;
    this.webUrl = webUrl;
  }
}


@Entry
@Component
struct Index {
  @State message: string = '快速入门';

  build() {
    Column() {
      Text(this.message)
        //.id('HelloWorld') // 这个不需要
        .fontSize(24)
        .fontWeight('700')
        .width("100%")
        .textAlign(TextAlign.Start)
        .padding({"left":16})
        .fontFamily("HarmonyHeiTi-Bold")
        .lineHeight(33)
      // 把Banner放在文字的下面,这里需要滚动了
      Scroll() {
        Column() {
          Banner()
          EnablementView()
          TutorialView()
        }
      }
      .layoutWeight(1)
      .scrollBar(BarState.Off)
      .align(Alignment.TopStart)

    }
    .height('100%')
    .width('100%')
    .backgroundColor("#F1F3F5")
  }
}

// 新建一个Banner
@Component
@Preview
struct Banner{

  @State bannerList: Array<BannerClass>=[
    new BannerClass('pic0',$r('app.media.banner_pic0'),'https://developer.huawei.com'),
    new BannerClass('pic1',$r('app.media.banner_pic1'),'https://developer.huawei.com'),
    new BannerClass('pic2',$r('app.media.banner_pic2'),'https://developer.huawei.com'),
    new BannerClass('pic3',$r('app.media.banner_pic3'),'https://developer.huawei.com'),
    new BannerClass('pic4',$r('app.media.banner_pic4'),'https://developer.huawei.com'),
    new BannerClass('pic5',$r('app.media.banner_pic5'),'https://developer.huawei.com')

  ]

  build() {
    // 滑动块,将image包裹起来
    Swiper(){
      
      ForEach(this.bannerList,(item:BannerClass,index:number)=>{
        Image(item.imgSrc).objectFit(ImageFit.Contain)
          .width("100%")
            // 这里能否合并left和right?
          .padding({"left":16,"right":16,"top":11})
            // 圆角边框
          .borderRadius(16)
      },(item:BannerClass,index:number)=>item.id)

    }
    //设置一下Swiper的属性。其中,autoPlay控制是否自动轮播子组件,loop属性控制是否循环播放,
    // indicator属性自定义导航点的位置和样式。
    .autoPlay(true)
    .loop(true)
    .indicator(new DotIndicator().color('#1a000000').selectedColor("#0a59f7"))


  }
}
//同时注释掉前面创建的EnablementItem组件的@Preview注解,方便单独预览TutorialItem组件。
//@Preview
@Component
struct EnablementItem{

  // 等下循环传入进来的item,被该变量接收,使用@Prop 修饰
  @Prop enablementItem: ArticleClass;

  private title: string = 'HarmonyOS第一课';
  private brief: string = '基于真实的开发场景,提供向导式学习,多维度融合课程等内容,给开发者提供全新的学习体验。';

  build() {
    Column(){
      /**
       * 使用$r的方式给Image组件设置图片资源,设置图片宽度为100%,即宽度与根容器Column保持一致。

       设置填充效果为cover模式,即保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界。
       */
      Image($r('app.media.enablement_pic1')).width('100%').objectFit(ImageFit.Cover)
        .height(96)
        // 图片圆角边框
        .borderRadius({
          topLeft:16,
          topRight:16
        })

      /*
      接下来给Text组件添加属性,textOverFlow属性设置文本超长时的显示方式,在这里我们设置它的值为Ellipsis,表示超长时使用省略号替代。

maxLines属性设置文本的最大行数,我们设置title最多显示一行,brief最多显示两行。

到这里我们完成了“赋能套件介绍”网格布局Item的创建。
       */
      Text(this.title)
        .height(19)
        .width('100%')
        .fontSize(14)
        .textAlign(TextAlign.Start)
        .textOverflow({ overflow: TextOverflow.Ellipsis })
        .maxLines(1)
        .fontWeight(400)
        .padding({ left: 12, right: 12 })
        .margin({ top: 8 })
      // 第二行文字
      Text(this.brief)
        .height(32)
        .width('100%')
        .fontSize(12)
        .textAlign(TextAlign.Start)
        .textOverflow({ overflow: TextOverflow.Ellipsis })
        .maxLines(2)
        .fontWeight(400)
        .fontColor('rgba(0, 0, 0, 0.6)')
        .padding({ left: 12, right: 12 })
        .margin({ top: 2 })

    }.width(160)
    .height(169)
    .borderRadius(16)
    .backgroundColor(Color.White)
    
  }
}


@Preview
@Component
struct TutorialItem {

  @Prop tutorialItem: ArticleClass;

  private title: string = 'Step1 快速入门介绍';
  private brief: string = '本篇教程实现了快速入门——一个用于了解和学习HarmonyOS的应用程序 。';

  build() {
    // TutorialItem 布局代码
    Row() {
      Column() {
        // 这里的两个文本样式有些多余了,不知有没有办法写一个样式,然后套用
        Text(this.title)
          .height(19)
          .width('100%')
          .fontSize(14)
          .textAlign(TextAlign.Start)
          .textOverflow({ overflow: TextOverflow.Ellipsis })
          .maxLines(1)
          .fontWeight(400)
          .margin({ top: 4 })

        Text(this.brief)
          .height(32)
          .width('100%')
          .fontSize(12)
          .textAlign(TextAlign.Start)
          .textOverflow({ overflow: TextOverflow.Ellipsis })
          .maxLines(2)
          .fontWeight(400)
          .fontColor('rgba(0, 0, 0, 0.6)')
          .margin({ top: 5 })
      }
      .height('100%')
      .layoutWeight(1)
      .alignItems(HorizontalAlign.Start)
      .margin({ right: 12 })

      Image($r('app.media.enablement_pic1'))
        .height(64)
        .width(108)
        .objectFit(ImageFit.Cover)
        .borderRadius(16)
    }.width('100%')
    .height(88)
    .borderRadius(16)
    .backgroundColor(Color.White)
    .padding(12)
    .alignItems(VerticalAlign.Top)
  }
}


@Preview
@Component
struct EnablementView{
  // 需要解析的数据,放在build上面
  @State enablementList: Array<ArticleClass> = [
    new ArticleClass('1', $r('app.media.enablement_pic1'), 'HarmonyOS第一课',
      '基于真实的开发场景,提供向导式学习,多维度融合课程等内容,给开发者提供全新的学习体验。',
      'https://developer.huawei.com/consumer/cn/doc/harmonyos-video-courses/video-tutorials-0000001443535745'),
    new ArticleClass('2', $r('app.media.enablement_pic2'), '开发指南',
      '提供系统能力概述、快速入门,用于指导开发者进行场景化的开发。指南涉及到的知识点包括必要的背景知识、符合开发者实际开发场景的操作任务流(开发流程、开发步骤、调测验证)以及常见问题等。',
      'https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/application-dev-guide-0000001630265101'),
    new ArticleClass('3', $r('app.media.enablement_pic3'), '最佳实践',
      '针对新发布特性及热点特性提供详细的技术解析和开发最佳实践。',
      'https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/topic-architecture-0000001678045510'),
    new ArticleClass('4', $r('app.media.enablement_pic4'), 'Codelabs',
      '以教学为目的的代码样例及详细的开发指导,帮助开发者一步步地完成指定场景的应用开发并掌握相关知识。Codelabs将最新的鸿蒙生态应用开发技术与典型场景结合,让开发者快速地掌握开发高质量应用的方法。同时支持互动式操作,通过文字、代码和效果联动为开发者带来更佳的学习体验。',
      'https://developer.huawei.com/consumer/cn/doc/harmonyos-codelabs/codelabs-0000001443855957'),
    new ArticleClass('5', $r('app.media.enablement_pic5'), 'Sample',
      '面向不同类型的开发者提供的鸿蒙生态应用开发优秀实践,每个Sample Code都是一个可运行的工程,为开发者提供实例化的代码参考。',
      'https://developer.huawei.com/consumer/cn/doc/harmonyos-samples/samples-0000001162414961'),
    new ArticleClass('6', $r('app.media.enablement_pic6'), 'API参考',
      '面向开发者提供鸿蒙系统开放接口的全集,供开发者了解具体接口使用方法。API参考详细地描述了每个接口的功能、使用限制、参数名、参数类型、参数含义、取值范围、权限、注意事项、错误码及返回值等。',
      'https://developer.huawei.com/consumer/cn/doc/harmonyos-references/development-intro-0000001580026066'),
    new ArticleClass('7', $r('app.media.enablement_pic7'), 'FAQ',
      '开发者常见问题的总结,开发者可以通过FAQ更高效地解决常见问题。FAQ会持续刷新,及时呈现最新的常见问题。',
      'https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs/faqs-development-0000001753952202'),
    new ArticleClass('8', $r('app.media.enablement_pic8'), '开发者论坛', '和其他应用开发者交流技术、共同进步。',
      'https://developer.huawei.com/consumer/cn/forum/home?all=1'),
  ];
  build() {
    //经过刚刚的分析,我们发现可以使用Column组件来作为外层容器。我们设置Column组件与其上元素的间距为18,设置Column元素的侧轴也就是横向方向上元素的对齐方式为从左至右的布局。
    Column() {
      //我们使用Text组件来加载“赋能套件”的文字。并配置字体进行美观地显示。
      Text('赋能套件')
        .fontColor('#182431')
        .fontSize(16)
        .fontWeight(500)
        .fontFamily('HarmonyHeiTi-medium')
        .textAlign(TextAlign.Start)
        .padding({ left: 16 })
        .margin({ bottom: 8.5 })

      // 使用格子 布局,
      Grid() {
        ForEach(this.enablementList, (item: ArticleClass) => {
          GridItem() {
            EnablementItem({ enablementItem: item })
          }
        }, (item: ArticleClass) => item.id)
      }
      //rowsTemplate和columnsTemplate属性值是一个由多个空格和'数字+fr'间隔拼接的字符串,fr的个数即网格布局的行或列数,fr前面的数值大小,用于计算该行或列在网格布局宽度上的占比,最终决定该行或列宽度。scrollBar用于关闭滚动条。
      // 这里设计真的是一言难尽啊
      .rowsTemplate('1fr')
      .columnsGap(8)
      .scrollBar(BarState.Off)
      .height(169)
      .padding({ top: 2, left: 16, right: 16 })
    }
    .margin({ top: 18 })
    .alignItems(HorizontalAlign.Start)


  }
}

@Preview
@Component
struct TutorialView{
  // 需要解析的数据,放在build上面
  @State tutorialList: Array<ArticleClass> = [
    new ArticleClass('1', $r('app.media.tutorial_pic1'), 'Step1 环境的搭建',
      '本篇教程实现了快速入门——一个用于了解和学习HarmonyOS的应用程序。',
      'https://developer.huawei.com/consumer/cn/forum/home?all=1'),
    new ArticleClass('2', $r('app.media.tutorial_pic2'), 'Step2 使用Swiper构建运营广告位',
      'Swiper组件提供滑动轮播显示的能力。Swiper本身是一个容器组件,当设置了多个子组件后,可以对这些子组件进行轮播显示。',
      'https://developer.huawei.com/consumer/cn/forum/home?all=1'),
    new ArticleClass('3', $r('app.media.tutorial_pic3'), 'Step3 创建和组合视图',
      'Item定义子组件相关特征。相关组件支持使用条件渲染、循环渲染、懒加载等方式生成子组件。',
      'https://developer.huawei.com/consumer/cn/forum/home?all=1'),
    new ArticleClass('4', $r('app.media.tutorial_pic4'), 'Step4 网格和列表组建的使用',
      '网格和列表组件中,当Item达到一定数量,内容超过屏幕大小时,可以自动提供滚动功能,适合用于呈现同类数据类型或数据类型集',
      'https://developer.huawei.com/consumer/cn/forum/home?all=1'),
    new ArticleClass('5', $r('app.media.tutorial_pic5'), 'Step5 应用架构设计基础',
      'ArkUI采取MVVM = Model + View + ViewModel模式,将数据与视图绑定在一起,更新数据的时候直接更新视图。',
      'https://developer.huawei.com/consumer/cn/forum/home?all=1'),
    new ArticleClass('6', $r('app.media.tutorial_pic6'), 'Step6 ArkWeb页面适配',
      'ArkWeb(方舟Web)提供了Web组件,用于在应用程序中显示Web页面内容,为开发者提供页面加载、页面交互、页面调试等能力。',
      'https://developer.huawei.com/consumer/cn/forum/home?all=1'),
    new ArticleClass('7', $r('app.media.tutorial_pic7'), 'Step7 数据驱动UI更新', '数据更新的同时会直接驱动UI的改变',
      'xxx'),
    new ArticleClass('8', $r('app.media.tutorial_pic8'), 'Step8 设置组件导航',
      'Navigation组件适用于模块内页面切换,一次开发,多端部署场景。通过组件级路由能力实现更加自然流畅的转场体验,并提供多种标题栏样式来呈现更好的标题和内容联动效果。',
      'https://developer.huawei.com/consumer/cn/forum/home?all=1'),
    new ArticleClass('9', $r('app.media.tutorial_pic8'), 'Step9 原生智能:AI语音朗读',
      '文本转语音服务提供将文本信息转换为语音并进行播报的能力,便于用户与设备进行互动,实现实时语音交互,文本播报。',
      'https://developer.huawei.com/consumer/cn/forum/home?all=1'),
    new ArticleClass('10', $r('app.media.tutorial_pic8'), 'Step10 原生互联:分布式流转',
      '流转能力打破设备界限,多设备联动,使用户应用程序可分可合、可流转,实现如邮件跨设备编辑、多设备协同健身、多屏游戏等分布式业务。',
      'https://developer.huawei.com/consumer/cn/forum/home?all=1'),
    new ArticleClass('11', $r('app.media.tutorial_pic8'), 'Step11 一次开发,多端部署',
      '一套代码工程,一次开发上架,多端按需部署。支撑开发者快速高效的开发支持多种终端设备形态的应用,实现对不同设备兼容的同时,提供跨设备的流转、迁移和协同的分布式体验。',
      'https://developer.huawei.com/consumer/cn/forum/home?all=1'),
  ];
  build() {
    Column() {
      //设计入门教程文字
      Text('入门教程')
        .fontColor('#182431')
        .fontSize(16)
        .fontWeight(500)
        .fontFamily('HarmonyHeiTi-medium')
        .textAlign(TextAlign.Start)
        .padding({ left: 16 })
        .margin({ bottom: 8.5 })
      // 使用循环列表,这里显示的List
      List({ space: 12 }) {
        ForEach(this.tutorialList, (item: ArticleClass) => {
          ListItem() {
            // 注意这传入的item,是在TutorialItem里面用@Prop修饰的变量获取
            TutorialItem({ tutorialItem: item })
          }
        }, (item: ArticleClass) => item.id)
      }
      .scrollBar(BarState.Off)
      .padding({ left: 16, right: 16 })
    }
    .margin({ top: 18 })
    .alignItems(HorizontalAlign.Start)
  }
}

一起来看看运行结果

最终的运行结果如下:

86ed826a1889493c826f9d9dcc301e9e.png

可以上下和左右滑动.

完结撒花.有需要源代码的可以留言告诉我一起讨论.

基于Kotlin Multiplatform的鸿蒙跨平台开发实践 为了提供更好的用户体验,支持更多的应用生态,哔哩哔哩在去年年底启动了哔哩哔哩鸿蒙原生应用的开发。 阅读详情

相关推荐

HarmonyOS第一课 05 从简单的页面开始-习题

【习题】从简单的页面开始通过/及格分80/ 满分100。

1269

鸿蒙应用架构设计基础——MVVM模式

在本章中,我们学习了如何应用MVVM模式和三层架构来开发更复杂的APP。通过调整目录结构,我们将代码分层管理,将数据模型放置在model文件夹中,UI组件放置在view文件夹中。我们还学习了如何从JSON文件中加载数据,并使用ResourceManager读取rawfile目录下的JSON文件内容。通过aboutToAppear生命周期回调函数,我们确保在页面加载时获取数据。最后,我们调整了BannerClass和ArticleClass的定义,以适配从JSON文件中读取的数据,并确保在真机或模拟器上运行应

让每一个想学习编程的人,都能学会,都能看懂,看了都有收获! 1623

<HarmonyOS第一课>从简单的页面开始

Harmony OS ArtUI考试

weixin_44967801的博客 2418

使用Swiper构建运营推荐位

根据本教程进行学习,您可以选择从上一教程结束时构建完成的项目开始,也可以直接运行02_StartingPoint文件夹中的项目。02_StartingPoint文件夹:截止到本节内容之前不包括本节内容的所有代码根据教程中的提示使用02_Resources文件夹中的文件。02_Resources文件夹:本节内容中需要用到的图片、文本等资源文件如果您想要自行探索,可以直接打开02_Complete文件夹中的项目并浏览代码。

RZer的博客 904

《HarmonyOS实战——前端开发华为鸿蒙系统应用 OpenHarmony JS》

导读:一款“面向未来”、面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统 。现已开源,名为 OpenHarmony。2019 年 8 月 9 日,华为在 HDC 开发...

孙叫兽的博客 1万+

HarmonyOS 鸿蒙入门教程之01 基础环境和开发工具 (教程含源码)

HarmonyOS 鸿蒙入门教程之01 基础环境和开发工具 鸿蒙系统是什么 HarmonyOS是一款“面向未来”、面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统。在传统的单设备系统能力的基础上,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持多种终端设备。 对消费者而言,HarmonyOS能够将生活场景中的各类终端进行能力整合,形成一个“超级虚拟终端”,可以实现不同的终端设备之间的快速连接、能力互助、资源共享,匹配合适的设备、提供流畅的全场景体验。

iCloudEnd的博客 4万+

鸿蒙开发中,index.ets 文件有哪些用法?

摘要: 鸿蒙(HarmonyOS)应用开发中,index.ets文件的用途因模块类型而异: 主模块(entry):作为应用入口,负责路由初始化、生命周期管理,需与EntryAbility.ets配合使用; 功能模块(feature):封装模块逻辑,对外提供统一API,隐藏内部跳转细节; 共享模块(shared):集中导出工具、组件等,减少路径依赖。 最佳实践包括路由分层管理、避免在入口文件写UI、添加TypeScript类型支持。不同场景下合理设计index.ets可提升代码可维护性和扩展性。(150字)

梦想不只是梦与想的博客 1771

HarmonyOS鸿蒙开发之05 运行第一个页面 (教程含源码)

实战需求 本期,我们来从零开始创建一个鸿蒙App 前期文章 原创 HarmonyOS 鸿蒙入门教程之01 基础环境和开发工具 (教程含源码) 原创 HarmonyOS 鸿蒙开发之02开发工具安装 原创 HarmonyOS 鸿蒙入门教程之03 运行开发工具完成基础配置DevEco Studio(教程含源码) 原创 HarmonyOS鸿蒙开发之04 运行第一个hello world (教程含源码) 编写您的第一个鸿蒙App页面 1、创建项目 如何创建项目,请参考这篇

iCloudEnd的博客 9769

韦东山-首批华为鸿蒙系统课程开发者

01 鸿蒙 OS 2.0 正式开源 昨天下午,在华为开发者大会 2020 上,华为消费者业务 CEO 余承东宣布推出鸿蒙 OS 2.0 (HarmonyOS 2.0),正式面向应用开发者发布鸿蒙 OS 的 Beta 版本,即日起开发者可以获得面向大屏、手表、车机的 SDK、工具、文档和模拟器,今年 12 月将发布手机版本的 SDK、工具、文档和模拟器。明年华为智能手机将全面升级支持鸿蒙 2.0。 与此同时,余承东宣布将鸿蒙 OS 的代码捐赠给开放原子开源基金会进行开源孵化,并公布了鸿蒙系统的开源路标: .

韦东山嵌入式专栏 1万+

HarmonyOS鸿蒙开发之06 通过代码创建页面 Feature Ability(教程含源码)

实战需求 本期,我们来从零开始通过代码创建一个页面 前期文章 原创 HarmonyOS 鸿蒙入门教程之01 基础环境和开发工具 (教程含源码) 原创 HarmonyOS 鸿蒙开发之02开发工具安装 原创 HarmonyOS 鸿蒙入门教程之03 运行开发工具完成基础配置DevEco Studio(教程含源码) 原创 HarmonyOS鸿蒙开发之04 运行第一个hello world (教程含源码) 原创 HarmonyOS鸿蒙开发之05 运行第一个页面 (教程含源码) 通过代码编写您的第一个鸿蒙App页

iCloudEnd的博客 7683

Ubuntu本地部署CodeX编程助手:CLI配置全指南

本地AI编程助手是当前开发者关注的核心技术趋势,指在不依赖云端API、保障代码隐私前提下,于本地环境运行具备代码理解、多语言补全与知识库检索能力的智能辅助工具。其技术原理涉及模型加载、API网关编排、向量数据库集成及系统级资源调度,关键价值在于可控性、低延迟与合规性。典型应用场景包括企业内网DevOps提效、边缘设备嵌入式开发支持,以及敏感代码场景下的离线编程增强。本文聚焦Ubuntu系统下基于CLI的手动配置路径,深入解析Ollama服务注册、Node.js版本锁定、API Key环境隔离及Qwen2.5

weixin_26804345的博客 591

【HarmonyOS鸿蒙系统开发技术】20.鸿蒙 HarmonyOS 鸿蒙 关于元服务的应用开发

元服务(原名为原子化服务)是HarmonyOS提供的一种面向未来的服务提供方式。它是一种新型应用程序形态,具有独立入口、免安装的特点,可以为用户提供一个或多个便捷服务。以线上购物为例,传统购物应用需要先安装应用,打开应用查找商品,加入购物车,然后完成支付。而通过元服务的方式,可以将购物过程拆分为多个服务,例如“商品浏览”、“购物车”、“支付”等,无需安装应用,通过丰富的入口直达服务页面。例如,将心仪的商品页添加到桌面,可以实时掌握商品价格的变动。在秒杀时间点,可以直接进入购物车进行结算。

xzs51job的专栏 3561

Blender关于GIS安装及使用天地图

Blender下载安装及GIS插件的安装及使用

Miss_SQ的博客 6968

韦东山鸿蒙开发教程05 - 鸿蒙系统体验之在IMX6ULL上体验鸿蒙系统

第一章 在IMX6ULL上体验鸿蒙系统 请先下载以下文件,里面含有烧写软件: https://gitee.com/weidongshan/openharmony_for_imx6ull/repository/archive/master.zip 鸿蒙内核Liteos-a的官方代码目前只支持海思的芯片,我作为首批开发者入驻华为一个多月,成功在100ASK_IMX6ULL上移植了Liteos-a。 本文先让大家体验一下Liteos-a,后续会发布教程、视频、源码。 百问网开发了一款烧写软件:100ask_imx

韦东山嵌入式专栏 9848

国产AI芯动力:复旦微FMQL100TAI900 FPGA原型验证板全解析

本文全面解析了复旦微FMQL100TAI900 FPGA原型验证板在国产AI硬件领域的创新突破。该板卡采用全栈国产化设计,具备出色的AI推理性能、视频处理能力和接口生态,特别适合工业质检、智能交通等场景。文章详细介绍了其芯片架构、存储子系统、接口扩展及电源设计,并分享了实战开发经验,为开发者提供了一套可靠的国产计算平台解决方案。

weixin_29250573的博客 456

xilinx zynq-7000 linux下rs422串口通信测试步骤

这几天使用xilinx的zynq-7000系列调试rs422串口,期间遇到不少问题,好在最终调试完成,在这里记录一下调试步骤。 我用的soc型号是xc7z100,板载了2个rs422外设,PS端有2个uart控制器,uart0用于连接rs232并作为console控制台输出,uart1连接rs422。 rs422和主板连线原理图如下: 其中422_TXD1_3V3 和422_RXD1_3V3 为数据发送和接收引脚,422_TXD_DE1_3V3为发送使能引脚,422_RXD_REn1_...

dongyunke的博客 5907

华为鸿蒙OS精品资料汇总,持续更新中

鸿蒙OS学习资料整理,持续更新中鸿蒙OS简介鸿蒙OS重点资料分类整理 鸿蒙OS简介 华为在2020.09.10正式发布了HarmonyOS 2.0,引发了IT界学习鸿蒙OS的热潮。本文是对互联网上鸿蒙资料的整理,本人也正在持续学习和更新中。 根据官方的定义,HarmonyOS是一款“面向未来”、面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统。在传统的单设备系统能力的基础上,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持多种终端设备的能力。 鸿蒙OS

qq_31765191的博客 1万+

上、下拉电阻(定义、强弱上拉、常见作用、吸电流、拉电流、灌电流)

1.上、下拉电阻定义 上拉电阻是把一个信号通过一个电阻接到电源(Vcc),下拉电阻是一个信号通过一个电阻接到地(GND)。 2.强上拉、弱上拉 强上拉、弱上拉的强弱只是上拉电阻的阻值不同,没有什么严格区分。例如:50Ω上拉,一般成为强上拉;100kΩ上拉则称为弱上拉。下拉也是一样的。强拉电阻的极端就是0Ω电阻,即将信号线直接与电源或低相连接。 3.上、下拉电阻的作用 因为上下拉电阻的作用概念很宽泛,不用领域的使用方法也不同,常见使用方法整理如下: ...

小浪宝宝的博客 3万+

Harmony:关于鸿蒙系统的内容都总结在这里了

比如我定义了 这四个视图元素按照屏幕宽度四等分 的规则,那么在任何尺寸下,这四个视图元素都会四等分屏幕宽度,从而达到相同的设计效果,这种在ArkUI里称为:均分能力 / 布局。

Carson带你学Android 5803

基于 Quest 摄像头数据开发的原理介绍【Unity Meta Quest MR 开发教程】

比如想在识别到的现实物体上叠加虚拟物体,需要知道这个现实物体在 Unity 的世界坐标下的哪个位置,是带有 x,y,z 三个轴的数据的。而 WebCamTexture 捕捉到的图像只是个 2D 的平面,没有三维世界的深度信息,我们通过物体识别算法识别到的物体坐标只是在这个 2D 平面上的一个屏幕坐标,可以理解为 Quest 拍摄了一张照片,我们识别到这张照片上的某个像素点为需要识别的现实物体的中心。是不是看起来比较复杂?Quest 的相机访问功能是在安卓的。

qq_46044366的博客 2103

华为OD机试真题2026双机位C卷 C语言 实现【主次关联成环警告】

在ICT运维领域,现网运维工程师面向对设备上报的众多告警,往往需要筛选出最主要的告警优先处理,次等级的告警或许为同一个根因导致的告警,处理优先级会放后或者不处理,这样就诞生出主次关联告警的概念。给定一系列告警的主次关联关系,判断是否存在如下情况:

MISAYAONE的博客 172

华为鸿蒙任务栏,华为鸿蒙正式上线,这些功能比安卓强

华为鸿蒙系统(HarmonyOS)大家应该不陌生吧。在 2019 年 8 月 9 日,华为在东莞举行的开发者大会上,公布了全新操作系统——鸿蒙。215006wy031eyyzl02f6ss.jpg (27.73 KB, 下载次数: 1)2021-5-12 21:50 上传鸿蒙系统并不只限于手机,它的定位是全场景的分布式系统。简单的来将,就是可以在各种设备,不限于手机平板、智能穿戴、智能家居上运行实...

weixin_35949298的博客 1万+

【数据结构】考点二十八 : 二叉树的概念:二叉树的度、完全二叉树、满二叉数结点数、哈夫曼结点数、完全二叉树的深度

二叉树(Binary Tree)是一种常见的数据结构,它或者为空(null),或者由一个根节点(root node)和两个子树(left subtree 和 right subtree)组成,这两个子树又分别是一棵二叉树。二叉树的每个节点最多有两个子节点,通常称为左子节点(left child)和右子节点(right child)。

超越的博客 1737

首批华为鸿蒙系统课程开发者

01 鸿蒙 OS 2.0 正式开源 昨天下午,在华为开发者大会 2020 上,华为消费者业务 CEO 余承东宣布推出鸿蒙 OS 2.0 (HarmonyOS 2.0),正式面向应用开发者发布鸿蒙 OS 的 Beta 版本,即日起开发者可以获得面向大屏、手表、车机的 SDK、工具、文档和模拟器,今年 12 月将发布手机版本的 SDK、工具、文档和模拟器。明年华为智能手机将全面升级支持鸿蒙 2.0。 华为高管王成录邀请开发者共建鸿蒙 OS生态 与此同时,余承东宣布将鸿蒙 OS 的代码捐赠给开放原子开源基金会进

嵌入式与人工智能 8424

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

鸿蒙开发入门指南

学习目标:简单了解鸿蒙开发,为后续的学习做准备

来自想要赚大钱的小周同学 9421

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

韦东山鸿蒙开发教程05 - 在STM32MP157上体验鸿蒙系统

鸿蒙内核Liteos-a的官方代码目前只支持海思的芯片,我作为首批开发者入驻华为一个多月,成功在100ASK_IMX6ULL、100ASK_STM32MP157上移植了Liteos-a。 本文先让大家在STM32MP157上体验一下Liteos-a。 ST公司有一款烧写软件:STM32CubeProgrammer,它的界面如下: 使用这软件,只需要一条USB线连接电脑和开发板USB OTG口,只需要点击几个按钮就可以体验鸿蒙系统。 1.1 100ASK_STM32MP157启动开关 3.1.1 全功能版 板

韦东山嵌入式专栏 8235

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: HarmonyOS第一课 05 从简单的页面开始-开发01
下一篇: HarmonyOS第一课 06 构建更加丰富的页面-习题解析
互联网时光机
博客等级 码龄20年 400粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网时光机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值