鸿蒙开发实现弹幕功能

一直会分享,虽然鸿蒙目前来没有多大发展,但不可否然以后发展,华为的技术是一大突破,存在即合理
可以现在没有多大发展。但不可否定未来的发展。

关注’猿来编码‘,微信订阅号,回复 ’组件‘,获取

鸿蒙开发实现弹幕功能如下:
在这里插入图片描述
弹幕轮播组件:BannerScroll

import type { IDanMuInfoList, IDanMuInfoItem } from '../model/DanMuData'
//定义组件
@Component
export default struct BannerScroll {
  //@Watch 用来监视状态数据的变化,包括:@State、@Prop、@Link、@Provide、@Consume
  //一旦状态数据变化,监视的回调就会调用
  // 我们可以在监视的回调中执行应用需要的特定逻辑
  @Link @Watch('start') bannerList: IDanMuInfoList
  @State scrollList: IDanMuInfoList = []
  scroller: Scroller = new Scroller()

  aboutToAppear() {
    this.start()
  }

  aboutToDisappear() {
    this.stop()
  }

  xOffset: number = 0 // 位移距离
  timeId: number // 定时器标识
  duration: number = Math.round(1000 / 60) // 位移间隔时间

  move() {
    this.stop()
    this.timeId = setTimeout(() => {
      this.xOffset += 4
      // 动画的持续时间,不能大于或等于定时器的间隔
      this.scroller.scrollTo({
        xOffset: this.xOffset / 10,
        yOffset: 0,
        animation: { duration: this.duration - 5, curve: Curve.Linear }
      })
      this.move()
    }, this.duration)
  }

  start() {
    const bannerList = this.bannerList;
    if (bannerList.length === 0) {
      return;
    }
    this.scrollList = [...bannerList, ...bannerList].map((item, index) => {
      return {
        ...item,
        id: index
      }
    })
    this.move()
  }

  stop() {
    clearInterval(this.timeId);
  }

  reset(firstIndex: number) {
    if (firstIndex === this.bannerList.length) {
      this.xOffset = 0;
      this.scroller.scrollTo({ xOffset: 0, yOffset: 0, animation: { duration: 0, curve: Curve.Linear } })
    }
  }

  build() {
    List({ scroller: this.scroller }) {
      ForEach(this.scrollList, (banner: IDanMuInfoItem) => {
        ListItem() {
          Row({ space: 6 }) {
            Text(banner.content).fontSize(14)
          }
          .padding({ top: 6, left: 6, bottom: 6, right: 10 })
          .borderRadius(42)
          .backgroundColor('#CDFFD9')
          .margin({ left: 10 })
        }
      }, banner => banner.id)
    }
    .listDirection(Axis.Horizontal) // 排列方向
    .edgeEffect(EdgeEffect.None) // 滑动到边缘无效果
    .onScrollIndex(this.reset.bind(this))
    .width('100%')
    .cachedCount(4)
    .hitTestBehavior(HitTestMode.None)
  }
}

关注‘猿来编码’,回复弹幕,获取更多,以后也会继续分享鸿蒙相关知识,相互学习。谢谢

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
华为鸿蒙HarmonyOS开发整理资料汇总,共38份。 1学前必读:HarmonyOS学习资源主题分享 2学前必读:OpenHarmony-联盟生态资料合集 3-1.HarmonyOS概述:技术特性 3-2.HarmonyOS概述:开发工具与平台 3-3.HarmonyOS概述:系统安全 3-4.HarmonyOS概述:系统定义 3-5.HarmonyOS概述:下载与安装软件 3-6.HarmonyOS概述:应用开发基础知识 3-7.HarmonyOS概述:最全HarmonyOS文档和社区资源使用技巧 4-1.生态案例:【开发者说】重塑经典,如何在HarmonyOS手机上还原贪吃蛇游戏 4-2.生态案例:HarmonyOLabo涂鸦鸿蒙亲子版 4-3.生态案例:HarmonyOS分镜头APP案例 4-4.生态案例:HarmonyOS时光序历史学习案例 4-5.生态案例:HarmonyOS先行者说 宝宝巴士携手HarmonyOS共同打造儿童教育交互新体验 4-6.生态案例:HarmonyOS智能农场物联网连接实践 4-7.生态案例:分布式开发样例,带你玩转多设备 4-8.生态案例:华为分布式日历应用开发实践 5-1.【Codelab】HarmonyOS基于图像模块实现图库图片的四种常见操作 5-2.【CodeLab】手把手教你创建第一个手机“Hello World” 5-3.【Codelab】如此简单!一文带你学会15个HarmonyOS JS组件 5-4.【Codelab】懒人“看”书新法—鸿蒙语音播报,到底如何实现? 5-5.【Codelab】基于AI通用文字识别的图像搜索,这波操作亮了 5-6.【Codelab】开发样例概览 6-1.技术解读之HarmonyOS轻量JS开发框架与W3C标准差异分析 6-2.技术解读之HarmonyOS驱动加载过程分析 6-3.技术解读之HarmonyOS组件库使用实践 6-4.技术解读之华为架构师解读:HarmonyOS低时延高可靠消息传输原理 6-5.技术解读之解密HarmonyOS UI框架 6-6.技术解读之如何从OS框架层面实现应用服务功能解耦 7-1.常见问题之HarmonyOS元服务的设计与开发解析 7-2.常见问题之Java开发 7-3.常见问题之JS开发 7-4.常见问题之模拟器登录 7-5.常见问题之模拟器运行 7-6.常见问题之如何使用JsJava开发HarmonyOS UI 7-7.常见问题之应用配置 7-8.常见问题之预览器运行 8【视频合集】入门到进阶视频学习资料合集30+
鸿蒙操作系统提供了异步回调机制和协程技术,可以实现类似expect的功能。下面我会分别介绍这两种方式的实现方法。 1. 异步回调机制 异步回调机制是鸿蒙操作系统提供的一种实现异步编程的方式,它可以让程序在等待某个事件完成的时候不阻塞,而是继续执行其他任务,当事件完成后再通过回调函数来处理事件结果。在实现类似expect的功能时,我们可以通过注册一个异步回调函数来等待某个事件的完成,当事件完成后再执行相应的操作。 例如,我们可以定义一个异步回调函数,用于等待用户输入: ``` #include <stdio.h> #include <async.h> void on_input(char *input) { printf("User input: %s\n", input); // 在这里执行相应的操作 } void wait_for_input() { async_input(on_input); } ``` 在上面的代码中,我们使用了async_input函数来注册一个异步回调函数on_input,当用户输入完成后,系统会自动调用on_input函数来处理用户输入。 2. 协程技术 协程是一种轻量级的线程,它可以在同一个线程中实现多个协程的切换,从而实现异步编程。在鸿蒙操作系统中,我们可以使用协程技术来实现类似expect的功能。 例如,我们可以定义一个协程函数,用于等待用户输入: ``` #include <stdio.h> #include <coroutine.h> void wait_for_input() { char buffer[1024]; coroutine_yield(); // 暂停当前协程,等待用户输入 scanf("%s", buffer); printf("User input: %s\n", buffer); // 在这里执行相应的操作 } void input_task() { coroutine_t co = coroutine_create(wait_for_input); coroutine_resume(co); // 启动协程,等待用户输入 } int main() { input_task(); // 启动输入任务 return 0; } ``` 在上面的代码中,我们使用了coroutine_yield函数来暂停当前协程,等待用户输入完成后再恢复协程的执行。当用户输入完成后,我们使用coroutine_resume函数来恢复协程的执行,从而继续执行相应的操作。 以上是两种实现类似expect的功能的方法,具体实现方式可以根据你的具体需求进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值