用arkts写鸿蒙app:简单的海报生成

本文涉及的产品
轻量应用服务器 2vCPU 1GiB,适用于搭建电商独立站
轻量应用服务器 2vCPU 4GiB,适用于网站搭建
轻量应用服务器 4vCPU 16GiB,适用于搭建游戏自建服
简介: 本文介绍了基于鸿蒙系统开发的一款个人字典与创作辅助应用,重点实现海报生成功能。通过Canvas画布组件完成图片绘制、文字填充等操作,并利用鸿蒙的沙盒机制和权限管理将生成的海报保存至本地。文中详细展示了代码实现步骤,包括渲染逻辑、数据导出及文件存储过程,同时提供了相关API文档链接以便参考。此项目不仅满足了作者个人兴趣需求,还体现了鸿蒙系统的独特特性和开发潜力。

鸿蒙应用开发的sdk 现在已经来到了5.0.2(api:14).离我上次写鸿蒙应用(那时候还是9、10)已经过去一段时间不到一年版本已经大跃进里面大部分api已经陌生


现在因为个人兴趣驱动想要开发一个方便自己查找字典创作app市面上app只有一个《西窗烛》做了鸿蒙兼容预计这个app涉及一些功能 列出来

           1.     下载网络资料(涉及网络请求下载文件权限

           2.     个人作品本地化存储涉及数据库操作sqlite3

           3.     作品海报生成 涉及画布渲染生成以及图片存储

           4.     作品AI朗读 涉及语言播放,AI朗读服务


等等细想其实预想的一些功能可以充分利用鸿蒙的很酷的特性不过现在只想方便一下自己兴趣所以那么多话不多说开始第一个功能海报生成


海报生成功能根据查阅文档下来需要以下功能实现首先canvas画布类似htmlcanvas这是一个UI组件海报编辑器页面肯定这个组件为主

代码如下

let settings: RenderingContextSettings = new RenderingContextSettings(true);
this.context = new CanvasRenderingContext2D(settings)
build() {
    Canvas(this.context)
      .width('100%').height('100%')
      .backgroundColor(Color.White)
      .onReady(() => {
          let bi = this.context
          //...code
      })
  }

 

接下来考虑下如何画布上加东西这些逻辑应该onready事件完成

画布写法html差别不大没学过可以html练手高级画布应用也是建议先在html文件实现逻辑渲染逻辑稳定下来翻译ets去。在预览器(previewer)中是可以预览canvas渲染后的效果。

填充背景

bi.fillStyle = '#CDCDCD'
bi.fillRect(0, 0, camvas.width, canvas.height)

画几何图形:

bi.fillStyle = '#CDCDCD'
bi.fillRect(0, 0, 200, 150)

填写文字

//简单渲染hello world
bi.font = '30px sans-serif'
bi.fillStyle ='#333';
bi.fillText("Hello World!", 20, 100)

canvas api链接https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V14/ts-canvasrenderingcontext2d-V14

 

涉及一些注意事项

渲染图片的代码要需要注意单位转换(有内置函数px2vp)。px => vp)

单位转换文档链接点击这里https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V14/ts-pixel-units-V14?catalogVersion=V14

 

 

接下来关键地方就是画完画布数据如何保存手机上

安卓图片保存需要加入图片操作权限鸿蒙一环节的细度上做出不同创新创建沙盒机制最小化权限影响

canvas画布数据可以导出几个不同数据抽象类imagedatadataurlimage pixelmap)

首先海报编辑器一块加个按钮(这个按钮不同于普通的按钮),加个点击事件

SaveButton({ text: SaveDescription.SAVE_IMAGE
          ,icon: SaveIconStyle.FULL_FILLED }).onClick(async (e:ClickEvent,result:SaveButtonOnClickResult) => {
            // console.log( `${JSON.stringify(result)}`)
            if(result == SaveButtonOnClickResult.SUCCESS){
                let imgdata = this.content.getImageData()
                //await saveToFile(  imgdata,getContext(this))
            }
          }).offset({x:0,y:-100})

点击事件触发就会弹出权限请求一定的时间内再次操作不会反复请求拿到用户同意结果 可以进行下一步代码saveToFile函数自己封装下面介绍函数具体代码

最后一步就是文件权限有关操作鸿蒙系统文件存储的机制我们需要认真了解具体文档链接https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V14/core-file-kit-intro-V14内容比较多需要耐心浏览


获得用户权限这个自定义的函数saveToFile保存图片到文件的逻辑

这个逻辑一次性用到3核心一个图片访问辅助二是文件读写包最后是图片压缩处理

//引用的包
import { fileIo as fs, ReadOptions} from '@kit.CoreFileKit';
import { image } from '@kit.ImageKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
// 请求授权图片保存到本地
export async function saveToFile(pixelMap: image.PixelMap, context: Context): Promise<void> {
  try {
    const phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
    const filePath = await phAccessHelper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'png');
    const imagePacker = image.createImagePacker();
    /* api版本13 以上用这个API */
    const imageBuffer = await imagePacker.packToData(pixelMap, {
      format: 'image/png',
      quality: 100
    });
    const mode = fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE;
    fd = (await fs.open(filePath, mode)).fd;
    await fs.truncate(fd);
    await fs.write(fd, imageBuffer);
    console.log(`image buffer length as ${imageBuffer.byteLength}`)
    console.log( `save path as ${filePath}`);
  } catch (err) {
    hilog.error(0x0000, "utils", 'saveToFile error:', JSON.stringify(err) ?? '');
  } finally {
    if (fd) {
      fs.close(fd);
    }
  }
}

 

就可以大功告成完善下其他细节run一下电脑的手机模拟器看到运行效果如自己所料成就满满。


最后想说例子只是简单借用画布组件生成数据保存本地逻辑实际中代码这个精深些,比如画布编辑器抽象封装(包括支持印章图片拖曳),还有渲染性能不足可以借用离线画布放在worker线程上跑,读取相册图片作为画布背景再二次加工等等更多代码其实官方代码案例其实有一个api在最新版本不能用了更新不算及时

,参考链接:https://gitee.com/harmonyos_samples/watermark


其他功能后续的开发中将我的开发体验感受同步文章这个还蛮考验自律。希望大家有机会跟我一样持着“干中学学中干”的理念,

相关文章
|
27天前
|
前端开发 API 开发者
harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)
本文由黑臂麒麟(6年前端经验)撰写,介绍ArkTS开发中的常用基础组件与布局组件。基础组件包括Text、Image、Button等,支持样式设置如字体颜色、大小和加粗等,并可通过Resource资源引用统一管理样式。布局组件涵盖Column、Row、List、Grid和Tabs等,支持灵活的主轴与交叉轴对齐方式、分割线设置及滚动事件监听。同时,Tabs组件可实现自定义样式与页签切换功能。内容结合代码示例,适合初学者快速上手ArkTS开发。参考华为开发者联盟官网基础课程。
149 75
harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)
|
1月前
|
开发框架 JavaScript 前端开发
鸿蒙开发:什么是ArkTs?
本小结主要简单介绍了ArkTs语言的相关知识,都是一些概念性质的内容,大家作为一个了解即可
160 61
|
27天前
|
数据管理 API 开发者
HarmonyOS:ArkTS RowSplit 组件自学指南
在 ArkTS 开发中,复杂界面布局需求常见,尤其需要灵活调整子组件宽度时,传统方式难以满足动态交互需求。`RowSplit` 组件解决了这一问题,支持横向布局并插入可拖动的分割线,让用户轻松调整子组件宽度,提升体验。本文详细介绍了 `RowSplit` 的功能、接口、属性及使用示例,帮助开发者掌握其用法,并总结了注意事项。通过合理配置,可实现灵活美观的布局效果。希望对您有帮助,欢迎关注、点赞和收藏!
74 31
|
27天前
|
API 开发者 UED
HarmonyOS:ArkTS 多态样式自学指南
本文介绍了 ArkTS 多态样式功能,帮助开发者为组件设置不同状态(如点击、按下、禁用等)下的样式。从 API Version 8 开始支持,API Version 11 引入 `attributeModifier` 动态设置属性。核心接口 `stateStyles` 支持多种状态,如 `normal`、`pressed`、`disabled` 等。文章通过示例代码展示了如何为 `Text` 和 `Radio` 组件设置多态样式,结合状态控制实现动态视觉反馈。掌握此功能可提升用户体验,推荐开发者根据需求灵活运用。
74 27
|
28天前
|
API 开发者
HarmonyOS:ArkTS Path 组件自学指南
在鸿蒙应用开发中,绘制复杂图形常面临传统布局方式难以满足需求的问题。ArkTS 的 Path 组件提供了解决方案,如同一把“神奇画笔”,支持通过灵活的命令和属性绘制直线、曲线、椭圆弧等多样图形。本文详细介绍了 Path 组件从 API Version 7 起的功能特性,包括 `commands`、`fill`、`stroke` 等核心属性,以及各类绘图命令如 `M`(移动)、`L`(直线)、`C`(贝塞尔曲线)等。结合示例代码,展示了如何绘制简单直线到复杂曲线图形,并拓展了颜色、透明度和线条样式的自定义方法。掌握 Path 组件,可为应用带来更丰富生动的视觉体验,助力开发者实现创意绘图需求。
73 21
|
1月前
|
存储 Java 编译器
鸿蒙开发:ArkTs数据类型
最后一点是,ArkTS不支持any和unknown类型,需要显式指定具体类型,否则会报异常,具体原因是,这是ArkTS的特性之一,那就是使用静态类型;如果程序采用静态类型,即所有类型在编译时都是已知的,那么开发者就能够容易理解代码中使用了哪些数据结构。同时,由于所有类型在程序实际运行前都是已知的,编译器可以提前验证代码的正确性,从而可以减少运行时的类型检查,有助于提升性能。
111 8
鸿蒙开发:ArkTs数据类型
|
16天前
|
缓存 开发工具 开发者
鸿蒙NEXT开发App相关工具类(ArkTs)
这段代码展示了一个名为鸿蒙NEXT开发 `AppUtil` 的工具类,主要用于管理鸿蒙应用的上下文、窗口、状态栏、导航栏等配置。它提供了多种功能,例如设置灰阶模式、颜色模式、字体类型、屏幕亮度、窗口属性等,并支持获取应用包信息(如版本号、包名等)。该工具类需在 UIAbility 的 `onWindowStageCreate` 方法中初始化,以便缓存全局变量。代码由鸿蒙布道师编写,适用于鸿蒙系统应用开发,帮助开发者更便捷地管理和配置应用界面及系统属性。
|
1月前
|
数据处理
鸿蒙开发:ArkTs字符串string
字符串类型是开发中非常重要的一个数据类型,除了上述的方法概述之外,还有String对象,正则等其他的用处,我们放到以后得篇章中讲述。
106 19
|
4天前
|
安全 前端开发 Android开发
拥抱国产化:转转APP的鸿蒙NEXT端开发尝鲜之旅
本文将要分享的是转转APP在开发全新鸿蒙NEXT端所遇到的一些问题,对比了鸿蒙开发和 Android、iOS 的不同,总结了这次开发过程中的一些经验等等。希望能带给你启发。
17 0
|
1月前
|
前端开发 JavaScript API
HarmonyOS:ArkTS 显式动画 animateTo 自学指南
本文深入解析了 ArkTS 中的 `animateTo` 全局显式动画接口,帮助开发者掌握其使用方法。文章从接口概述、参数详解到使用注意事项,结合实际示例代码,全面展示了如何通过配置 `AnimateParam` 对象实现流畅的动画效果。内容涵盖属性动画、布局变化及组件转场等场景,并强调不同版本的支持特性。适合初学者系统学习,也供进阶开发者参考优化动画体验。希望本文能助你快速上手 `animateTo`!
86 7
下一篇
oss创建bucket