简单3步,OpenHarmony上跑起ArkUI分布式小游戏

OpenHarmony ArkUI动画深入分析 动画是组件的基础特性之一,精心设计的动画使 UI 变化更直观,平滑的动画效果能够很好地增强差异性功能的过渡,有助于改进应用程序的外观并改善用户体验。OpenHarmony 动画分类:属性动画:组件的某些通用属性变化时,可以通过属性动画实现渐变过渡效果,提升用户体验。支持的属性包括 width、height、backgroundColor、opacity、scale、rotate、translate 等。显示动画:提供全局 animateTo 显式动画接口来指定由于闭包代码导致的状态变化插入过渡动效。 阅读详情

转自:OpenAtom OpenHarmony

在9月30日更新的 OpenHarmony3.0 LTS 上,标准系统新增支持了方舟开发框架(ArkUI)、分布式组网和 FA 跨设备迁移能力等新特性,因此我们结合了这三种特性使用 ets 开发了一款如下动图所示传炸弹应用。

​打开应用在通过邀请用户进行设备认证后,用户须根据提示完成相应操作,然后通过分布式流转实现随机传递炸弹给下一位用户的效果。那么这样一款传炸弹应用如何进行开发呢?

完整的项目结构目录如下:

├─entry
│  └─src
│      └─main
│          │  config.json // 应用配置
│          │
│          ├─ets
│          │  └─MainAbility
│          │      │  app.ets //ets应用程序主入口
│          │      │
│          │      └─pages
│          │              CommonLog.ets // 日志类
│          │              game.ets // 游戏首页
│          │              RemoteDeviceManager.ets // 设备管理类
│          │
│          └─resources // 静态资源目录
│              ├─base
│              │  ├─element
│              │  │
│              │  ├─graphic
│              │  ├─layout
│              │  ├─media // 存放媒体资源
│              │  │
│              │  └─profile
│              └─rawfile


我们可以分为如下 3 步:编写声明式 UI 界面、添加分布式能力和编写游戏逻辑。

一、编写声明式UI界面


1. 新增工程


在 DevEco Studio 中点击 File -> New Project ->Standard Empty Ability->Next,Language 选择 ETS 语言,最后点击 Finish 即创建成功。

图1 新建工程

2. 编写游戏页面
 

图2 游戏界面效果图

效果图如上可以分为两部分:

  • 顶部状态提示栏

首先在 @entry 组件入口 build() 中使用 Stack 作为容器,达到图片和文字堆叠的效果;

接着依次写入 Image 包裹的两个 Text 组件;

Stack() {
     Image($r(<span class="hljs-string">"app.media.title"</span>)).objectFit(ImageFit.Contain).height(<span class="hljs-number">120</span>)
     Column() {
        Text(<span class="hljs-keyword">this</span>.duration.toString() + <span class="hljs-string">'ms'</span>).fontColor(Color.White)
        Text(<span class="hljs-keyword">this</span>.touchText).fontColor(Color.White)
     }
  }

  • 中间游戏炸弹九宫格区域

使用 Grid 网格容器来编写九宫格区域;
在 GridItem 中 Stack (容器依次添加方块背景图片和炸弹图片;
在 visibility 属性中用 bombIndex 变量值来决定炸弹显示的位置;
通过 onClick 点击事件和 GestureGroup 组合手势加入单击、双击和长按的监听事件;

Stack() {
   Image($r(<span class="hljs-string">"app.media.background"</span>)).objectFit(ImageFit.Contain)
   Grid() {
     ForEach(<span class="hljs-keyword">this</span>.grid, (item) => {
       GridItem() {
         Stack() {
           Image($r(<span class="hljs-string">"app.media.squares"</span>)).objectFit(ImageFit.Contain)
           Image($r(<span class="hljs-string">"app.media.bomb"</span>))
             .width(<span class="hljs-string">'50%'</span>)
             .objectFit(ImageFit.Contain)
             .visibility(<span class="hljs-keyword">this</span>.bombIndex == item ? Visibility.Visible : Visibility.Hidden)
             <span class="hljs-comment">// 炸弹点击事件</span>
             .onClick((event) => {
               <span class="hljs-comment">// 单击</span>
               <span class="hljs-keyword">this</span>.judgeGame(RuleType.click)
             })
             .gesture(
             GestureGroup(GestureMode.Exclusive,
             LongPressGesture({ repeat: <span class="hljs-literal">false</span> })
               .onAction((event: GestureEvent) => {
                 <span class="hljs-comment">// 长按</span>
                 <span class="hljs-keyword">this</span>.judgeGame(RuleType.longPress)
               }),
             TapGesture({ count: <span class="hljs-number">2</span> })
               .onAction(() => {
                 <span class="hljs-comment">// 双击</span>
                 <span class="hljs-keyword">this</span>.judgeGame(RuleType.doubleClick)
               })
             )
         }
       }.forceRebuild(<span class="hljs-literal">false</span>)
     }, item => item)
   }
   .columnsTemplate(<span class="hljs-string">'1fr 1fr 1fr'</span>)
   .rowsTemplate(<span class="hljs-string">'1fr 1fr 1fr'</span>)
   .columnsGap(<span class="hljs-number">10</span>)
   .rowsGap(<span class="hljs-number">10</span>)
   .width(<span class="hljs-string">'90%'</span>)
   .height(<span class="hljs-string">'75%'</span>)
 }.width(<span class="hljs-string">'80%'</span>).height(<span class="hljs-string">'70%'</span>)

3. 添加弹窗

  • 创建规则游戏弹窗

  1)通过 @CustomDialog 装饰器来创建自定义弹窗,使用方式可参考:

自定义弹窗文档:zh-cn/application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md · OpenHarmony/docs - Gitee.com

  2)规则弹窗效果如下,弹窗组成由两个 Text 和两个 Image 竖向排列组成,所以我们可以在 build()下使用 Column 容器来包裹,组件代码如下;

图3 游戏规则

@CustomDialog
   struct RuleDialog {
      controller: CustomDialogController
      confirm: () => <span class="hljs-keyword">void</span>
      invite: () => <span class="hljs-keyword">void</span>
      @Consume deviceList: RemoteDevice[]

      build() {
         Column() {
            Text(<span class="hljs-string">'游戏规则'</span>).fontSize(<span class="hljs-number">30</span>).margin(<span class="hljs-number">20</span>)
            Text(<span class="hljs-string">'炸弹会随机出现在9个方块内,需要在规定时间内完成指定操作(点击、双击或长按),即可将炸弹传递给下一个人,小心炸弹可是会越来越快的喔!'</span>)
               .fontSize(<span class="hljs-number">24</span>).margin({ bottom: <span class="hljs-number">10</span> })
            Image($r(<span class="hljs-string">"app.media.btn_start"</span>)).objectFit(ImageFit.Contain).height(<span class="hljs-number">80</span>).margin(<span class="hljs-number">10</span>)
               .onClick(() => {
                  console.info(TAG + <span class="hljs-string">'Click start game'</span>)
                  <span class="hljs-keyword">if</span> (checkTrustedDevice(<span class="hljs-keyword">this</span>.remoteDeviceModel)) {
                     <span class="hljs-keyword">this</span>.controller.close()
                     <span class="hljs-keyword">this</span>.confirm()
                  }
               })
            Image($r(<span class="hljs-string">"app.media.btn_Invite"</span>)).objectFit(ImageFit.Contain).height(<span class="hljs-number">80</span>).margin(<span class="hljs-number">10</span>)
               .onClick(() => {
                  <span class="hljs-keyword">this</span>.invite()
               })
         }.width(<span class="hljs-string">'90%'</span>)
         .margin(<span class="hljs-number">20</span>)
         .backgroundColor(Color.White)
      }
   }


3)在 @entry 创建 CustomDialogController 对象并传入弹窗所需参数,后面可通过该对象 open() 和 close() 方法进行打开和关闭弹窗;

@Provide deviceList: RemoteDevice[] = []
private ruleDialog: CustomDialogController = <span class="hljs-keyword">new</span> CustomDialogController({
   builder: RuleDialog({
      invite: () => <span class="hljs-keyword">this</span>.InvitePlayer(),
      confirm: () => <span class="hljs-keyword">this</span>.startGame(),
      deviceList: <span class="hljs-keyword">this</span>.deviceList
   }),
   autoCancel: <span class="hljs-literal">false</span>
})

  • 创建游戏失败弹窗,并添加动画效果

图4 游戏失败弹窗动画

1)编写弹窗布局:将游戏失败文本、炸弹图片和再来一局按钮图片放置于 Column 容器中;

2)用变量来控制动画起始和结束的位置:用 Flex 容器包裹炸弹图片,并用 @State 装饰变量 toggle,通过变量来动态修改 [Flex]的direction 属性;

@State toggle: boolean = <span class="hljs-literal">true</span>
private controller: CustomDialogController
@Consume deviceList: RemoteDevice[]
private confirm: () => <span class="hljs-keyword">void</span>
private interval = <span class="hljs-literal">null</span>

build() {
   Column() {
      Text(<span class="hljs-string">'游戏失败'</span>).fontSize(<span class="hljs-number">30</span>).margin(<span class="hljs-number">20</span>)
      Flex({
         direction: <span class="hljs-keyword">this</span>.toggle ? FlexDirection.Column : FlexDirection.ColumnReverse,
         alignItems: ItemAlign.Center
      })
      {
         Image($r(<span class="hljs-string">"app.media.bomb"</span>)).objectFit(ImageFit.Contain).height(<span class="hljs-number">80</span>)
      }.height(<span class="hljs-number">200</span>)

      Image($r(<span class="hljs-string">"app.media.btn_restart"</span>)).objectFit(ImageFit.Contain).height(<span class="hljs-number">120</span>).margin(<span class="hljs-number">10</span>)
         .onClick(() => {
               <span class="hljs-keyword">this</span>.controller.close()
               <span class="hljs-keyword">this</span>.confirm()
         })
   }
   .width(<span class="hljs-string">'80%'</span>)
   .margin(<span class="hljs-number">50</span>)
   .backgroundColor(Color.White)
}


3)设置动画效果:使用 animateTo 显式动画接口炸弹位置切换时添加动画,并且设置定时器定时执行动画;

aboutToAppear() {
   <span class="hljs-keyword">this</span>.setBombAnimate()
}

setBombAnimate() {
   <span class="hljs-keyword">let</span> fun = () => {
      <span class="hljs-keyword">this</span>.toggle = !<span class="hljs-keyword">this</span>.toggle;
   }
   <span class="hljs-keyword">this</span>.interval = setInterval(() => {
      animateTo({ duration: <span class="hljs-number">1500</span>, curve: Curve.Sharp }, fun)
   }, <span class="hljs-number">1600</span>)
}


二、添加分布式流转


分布式流转需要在同一网络下通过  DeviceManager 组件进行设备间发现和认证,获取到可信设备的 deviceId 调用 FeatureAbility.startAbility(parameter),即可把应用程序流转到另一设备。

原本分布式流转应用流程如下:

  • 创建 DeviceManager 实例;
  • 调用实例的 startDeviceDiscovery(),开始设备发现未信任设备;
  • 设置设备状态监听 on('deviceStateChange',callback),监听设备上下线状态;
  • 设置设备状态监听 on('deviceFound',callback),监听设备发现;
  • 传入未信任设备参数,调用实例 authenticateDevice 方法,对设备进行 PIN 码认证;
  • 若是已信任设备,可通过实例的 getTrustedDeviceListSync() 方法来获取设备信息;
  • 将设备信息中的 deviceId 传入featureAbility.startAbility 方法,实现流转;
  • 流转接收方可通过featureAbility.getWant() 获取到发送方携带的数据;
  • 注销设备发现监听 off('deviceFound');
  • 注销设备状态监听 off('deviceStateChange');

项目中将上面设备管理封装至 RemoteDeviceManager,通过 RemoteDeviceManager 的四个方法来动态维护 deviceList 设备信息列表。

图5 分布式流转

项目实现分布式流转只需如下流程:

1. 创建RemoteDeviceManager实例

1)导入 RemoteDeviceManager

import {RemoteDeviceManager} from <span class="hljs-string">'./RemoteDeviceManager'</span>

2)声明 @Provide 装饰的设备列表变量 deviceList,和创建 RemoteDeviceManager 实例。

@Provide deviceList: RemoteDevice[] = []
private remoteDm: RemoteDeviceManager = <span class="hljs-keyword">new</span> RemoteDeviceManager(<span class="hljs-keyword">this</span>.deviceList)


2. 刷新设备列表


在生命周期 aboutToAppear 中,调用刷新设备列表和开始发现设备。

aboutToAppear 定义:函数在创建自定义组件的新实例后,在执行其 build 函数之前执行。

aboutToAppear() {
  <span class="hljs-keyword">this</span>.remoteDm.refreshRemoteDeviceList() <span class="hljs-comment">// 刷新设备列表</span>
  <span class="hljs-keyword">this</span>.remoteDm.startDeviceDiscovery() <span class="hljs-comment">// 开始发现设备</span>
}


3. 设备认证

invitePlayer(remoteDevice:RemoteDevice) {
  <span class="hljs-keyword">if</span> (remoteDevice.status == RemoteDeviceStatus.ONLINE) {
    prompt.showToast({ message: <span class="hljs-string">"Already invited!"</span> })
    <span class="hljs-keyword">return</span>
  }
  <span class="hljs-keyword">this</span>.remoteDm.authDevice(remoteDevice).then(() => {
    prompt.showToast({ message: <span class="hljs-string">"Invite success! deviceName="</span> + remoteDevice.deviceName })
  }).catch(() => {
    prompt.showToast({ message: <span class="hljs-string">"Invite fail!"</span> })
  })
}


4. 跨设备流转


从 deviceList 中获取设备列表在线的设备 Id,通过 featureAbility.startAbility 进行流转。

async startAbilityRandom() {
  <span class="hljs-keyword">let</span> deviceId = <span class="hljs-keyword">this</span>.getRandomDeviceId() <span class="hljs-comment">// 随机获取设备id</span>
  CommonLog.info(<span class="hljs-string">'featureAbility.startAbility deviceId='</span> + deviceId);
  <span class="hljs-keyword">let</span> bundleName = await getBundleName()
  <span class="hljs-keyword">let</span> wantValue = {
    bundleName: bundleName,
    abilityName: <span class="hljs-string">'com.sample.bombgame.MainAbility'</span>,
    deviceId: deviceId,
    parameters: {
      ongoing: <span class="hljs-literal">true</span>,
      transferNumber: <span class="hljs-keyword">this</span>.transferNumber + <span class="hljs-number">1</span>
    }
  };
  featureAbility.startAbility({
    want: wantValue
  }).then((data) => {
    CommonLog.info(<span class="hljs-string">' featureAbility.startAbility finished, '</span> + <span class="hljs-built_in">JSON</span>.stringify(data));
    featureAbility.terminateSelf((error) => {
      CommonLog.info(<span class="hljs-string">'terminateSelf finished, error='</span> + error);
    });
  });
}


5. 注销监听


在声明周期 aboutToDisappear 进行注销监听。

aboutToDisappear 定义:函数在自定义组件析构消耗之前执行。

aboutToDisappear() {
  <span class="hljs-keyword">this</span>.remoteDm.stopDeviceDiscovery() <span class="hljs-comment">// 注销监听</span>
}


三、编写游戏逻辑


1. 开始游戏

startGame() {
  CommonLog.info(<span class="hljs-string">'startGame'</span>);
  <span class="hljs-keyword">this</span>.randomTouchRule() <span class="hljs-comment">// 随机游戏点击规则</span>
  <span class="hljs-keyword">this</span>.setRandomBomb() <span class="hljs-comment">// 随机生成炸弹位置</span>
  <span class="hljs-keyword">this</span>.stopCountDown() <span class="hljs-comment">// 停止倒计时</span>
  <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.transferNumber < <span class="hljs-number">10</span>) {
    <span class="hljs-keyword">this</span>.duration = <span class="hljs-number">3000</span> - <span class="hljs-keyword">this</span>.transferNumber * <span class="hljs-number">100</span>
  } <span class="hljs-keyword">else</span> {
    <span class="hljs-keyword">this</span>.duration = <span class="hljs-number">2000</span>
  }
  <span class="hljs-keyword">const</span> interval: number = <span class="hljs-number">500</span>
  <span class="hljs-comment">// 开始倒计时</span>
  <span class="hljs-keyword">this</span>.timer = setInterval(() => {
    <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.duration <= interval) {
      <span class="hljs-keyword">this</span>.duration = <span class="hljs-number">0</span>
      clearInterval(<span class="hljs-keyword">this</span>.timer)
      <span class="hljs-keyword">this</span>.timer = <span class="hljs-literal">null</span>
      <span class="hljs-keyword">this</span>.gameFail()
    } <span class="hljs-keyword">else</span> {
      <span class="hljs-keyword">this</span>.duration -= interval
    }
  }, interval)
}


2. 判断输赢


编写判断逻辑,用于不同的点击事件中调用。

/**
 * 判断游戏输赢
 * @param operation 点击类型
 */
judgeGame(operation:RuleType) {
   this.stopCountDown()
   if (operation != this.ruleText) {
      this.gameFail()
   } else {
      prompt.showToast({ message: "finish" })
      this.bombIndex = -1
      this.startAbilityRandom()
   }
}


3. 游戏失败


游戏失败,弹出游戏失败弹框。

gameFail() {
  prompt.showToast({
    message: <span class="hljs-string">'Game Fail'</span>
  })
  CommonLog.info(<span class="hljs-string">'gameFail'</span>);
  <span class="hljs-keyword">this</span>.gameFailDialog.open()
}


四、项目下载和导入


项目仓库地址:

OpenHarmony-SIG/knowledge_demo_temp - Gitee.com

1)git下载

git clone https:<span class="hljs-comment">//gitee.com/openharmony-sig/knowledge_demo_temp.git</span>


2)项目导入

打开 DevEco Studio,点击 File->Open->下载路径/FA/Entertainment/BombGame

五、约束与限制


1. 设备编译约束


 2. 应用编译约束

HarmonyOS开发(ArkUI简单使用) Componentbuild(){//组件UI描述@Componentbuild(){//使用组件Com({title:'标题'})//UI描述@Componentbuild(){@Component//UI描述build(){ 阅读详情

相关推荐

【鸿蒙南向开发】—— 简单3步,OpenHarmony上跑起ArkUI分布式小游戏

打开应用在通过邀请用户进行设备认证后,用户须根据提示完成相应操作,然后通过分布式流转实现随机传递炸弹给下一位用户的效果。那么这样一款传炸弹应用如何进行开发呢?

huchenghe2的博客 1043

使用OpenHarmony在移动端开发ArkUI分布式小游戏的简单3步

本文向您展示了如何在移动端使用OpenHarmony开发ArkUI分布式小游戏的简单3步过程。您需要设置开发环境、创建项目并添加ArkUI框架依赖项,然后使用ArkUI框架构建游戏界面。确保您的开发环境正常运行,并具备构建OpenHarmony应用程序所需的工具和依赖项。在本文中,我将向您展示如何在移动端使用OpenHarmony开发分布式小游戏,并使用ArkUI框架来构建界面。在OpenHarmony开发环境设置好后,接下来我们将创建一个新的ArkUI分布式小游戏项目。您可以根据自己的需求修改项目名称。

GexObjectivec的博客 291

OpenHarmony实战——ArkUI中的线程和看门狗机制

本文主要分析ArkUI中涉及的线程和看门狗机制。

xianglizaibie的博客 708

【愚公系列】2023年12月 HarmonyOS教学课程 012-ArkUI组件(Grid/GridItem)

网格布局是一种新型的布局方式,它按照网格来划分页面,通过列和行来定义网格,使得页面的布局更加灵活、简洁、易于维护。网格布局能够将页面分成多个单元格,可以在这些单元格中布置各种元素,例如文本、图片、媒体等,从而实现页面的排版。网格布局支持自适应布局,能够轻松地实现响应式设计,支持多终端设备的显示。ArkUI提供了Grid容器组件和子组件GridItem,用于构建网格布局。Grid用于设置网格布局相关参数,GridItem定义子组件相关特征。

愚公智库 6万+

OpenHarmony实战:如何利用OpenHarmony ArkUI的Canvas组件实现涂鸦功能?

ArkUI是一套UI开发框架,提供了开发者进行应用UI开发时所需具备的能力。随着OpenAtom OpenHarmony(以下简称“OpenHarmony”)不断更新迭代,ArkUI也提供了很多新的组件,例如Canvas、OffscreenCanvas、XComponent组件等。新增的功能可以帮助开发者开发出更流畅、更美观的应用。本篇文章将为大家分享如何通过Canvas组件实现涂鸦功能,用户可以选择空白画布或者简笔图进行自由绘画。

xianglizaibie的博客 1094

华为官方解析开源鸿蒙 OpenHarmony 3.1关键特性画布,教你如何完成飞机大战小游戏

华为技术有限公司的江英杰为大家揭晓了关于开源鸿蒙 OpenHarmony 3.1 Beta 版中的一个关键特性,也就是 ArkUI 开发框架中的 canvas 画布。 据介绍,canvas 是 ArkUI 开发框架里的画布组件,常用于自定义绘制图形。因为其轻量、灵活、高效等优点,被广泛应用于 UI 界面开发中。本期,我们将为大家介绍 ArkUI 开发框架中 canvas 组件的使用。 canvas 介绍 1.1 什么是 canvas? 了解到,在 Web 浏览器中,canvas 是一个可自定义 wi

Harmony_wang的博客 3830

ArkUI-1.OpenHarmony开发语言简介

ArkUI

weixin_43700475的博客 1412

鸿蒙OpenHarmony【键鼠事件】 ArkUI 交互事件

焦点:指向当前应用界面上唯一的一个可交互元素,当用户使用键盘、电视遥控器、车机摇杆/旋钮等非指向性输入设备与应用程序进行间接交互时,基于焦点的导航和交互是重要的输入手段

adsjgfjha123123的博客 1104

OpenHarmony应用开发——在标准OpenHarmony上运行应用-标准OpenHarmony工程设置

随着物联网技术的飞速发展,操作系统作为万物互联的基石,其重要性日益凸显。OpenHarmony,作为华为捐赠的开源项目,旨在构建一个开放、标准、统一的智能设备操作系统,为物联网设备提供统一的平台支撑。本文将详细介绍如何在标准OpenHarmony上开发并运行应用,帮助开发者快速入门OpenHarmony应用开发领域。

物联网领域菜鸟~嘻嘻 1640

OpenHarmony应用ArkUI 状态管理开发案例

在声明式UI编程框架中,UI是程序状态的运行结果,用户构建了一个UI模型,其中应用的运行时的状态是参数。当参数改变时,UI作为返回结果,也将进行对应的改变。这些运行时的状态变化所带来的UI的重新渲染,在ArkUI中统称为状态管理机制。

鸿蒙开发知识记录 1360

OpenHarmony实战—— 基于OpenAtom OpenHarmony ArkUI深度定制的组件框架(Easyui)

Easyui是一套基于ArkTS语言开发的轻量、可靠的移动端组件库,它是对OpenAtom OpenHarmony(以下简称“OpenHarmony”) ArkUI进行深度定制的组件框架。Easyui可扩展性较强,可以基于源码进行二次开发,修改原有组件以及新增部分组件,以满足具体项目的开发需求。该框架适用大部分OpenHarmony应用的开发 ,能够更加完善OpenHarmony 的应用开发能力,使我们的应用开发更简单。通过本篇文章介绍,您对easyui组件框架应该有了初步的了解。

xianglizaibie的博客 916

OpenHarmony 实战开发——ArkUI之Canvas组件

在 Web 浏览器中,canvas 是一个可自定义 width、height 的矩形画布,画布左上角为坐标原点,以像素为单位,水平向右为 x 轴,垂直向下为 y 轴,画布内所有元素都基于原点进行定位。如图 1 所示,我们通过 标签,创建了一个 width= 1500px,height=900px 的空白画布,我们还需要“画笔”才能绘制图形。canvas 采用轻量的逐像素渲染机制,以 JS 为“画笔”直接控制画布像素,从而实现图形绘制。图 1 canvas 画布。

xianglizaibie的博客 1048

鸿蒙OpenHarmony【拖拽事件】 ArkUI 交互事件

拖拽事件提供了一种通过鼠标或手势触屏传递数据的机制,即从一个组件位置拖出(drag)数据并将其拖入(drop)到另一个组件位置,以触发响应。在这一过程中,拖出方提供数据,而拖入方负责接收和处理数据。这一操作使用户能够便捷地移动、复制或删除指定内容。

adsjgfjha123123的博客 1733

ArkUI实战,深入浅出OpenHarmony应用开发

在学习 OpenHarmony 应用开发的时候经常去 OpenHarmony 的相关仓库查看文档,有时候找文档并不是很顺利,于是自费建设了该网站,利用业余时间写了这本入门的《ArkUI实战》电子书把它挂到网站上,希望能给大家带来一点帮助,也算为 OpenHarmony 的发展做一点贡献吧。

快乐de灰太狼的专栏 2291

【Anaconda】conda国内镜像源快速配置指南(清华/阿里云)

本文详细介绍了如何为Anaconda配置国内镜像源(清华/阿里云),以显著提升conda包下载速度并减少安装失败率。通过分步指南和实用技巧,帮助开发者快速完成配置,优化Python开发环境。

weixin_33725722的博客 1488

2021秋招IC验证面经-ARM中国/中科芯/飞腾/地平线/中兴

中科芯 (央企福利待遇好,但是百分百不解决户口,适合当地人进去躺平。) 现场面试,三个面试官,时间大约40min 首先介绍一下自己,介绍一下项目。所做项目用到了FIFO吗,深度是多少,位宽是多少,仲裁算法是什么? 验证环境中的reference model是自己写的还是本身就有的,仲裁怎么在参考模型中实现,参考模型怎么获取寄存器的值? 怎么配置RTL寄存器,通过平台的寄存器模型进行寄存器配置,寄存器模型里边的方法,写一个寄存器或读一个寄存器怎么实现? 寄存器如何实现前门访问和后门访问,后门访问时

weixin_48014653的博客 6319
上一篇: HDC2021技术分论坛:如何高效完成HarmonyOS分布式应用测试?
下一篇: 【视频】UX设计第4期:HarmonyOS设计指南(二)
「已注销」
博客等级 码龄5年 1045粉丝 297原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值