0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HarmonyOS开发实例:【图片编辑应用】

jf_46214456 来源:jf_46214456 作者:jf_46214456 2024-04-23 09:42 次阅读

介绍

通过动态设置元素样式的方式,实现几种常见的图片操作,包括裁剪、旋转、缩放和镜像。效果如图所示:

相关概念

  • [image组件]:图片组件,用来渲染展示图片。
  • [div组件]:基础容器组件,用作页面结构的根节点或将内容进行分组。
  • [text组件]:文本组件,用于呈现一段信息
  • [setstyle]:动态设置组件样式的方法。

环境搭建

软件要求

  • [DevEco Studio]版本:DevEco Studio 3.1 Release及以上版本。
  • OpenHarmony SDK版本:API version 9及以上版本。

硬件要求

  • 开发板类型:[润和RK3568开发板]。
  • OpenHarmony系统:3.2 Release及以上版本。

环境搭建

完成本篇Codelab我们首先要完成开发环境的搭建,本示例以RK3568开发板为例,参照以下步骤进行:

  1. [获取OpenHarmony系统版本]:标准系统解决方案(二进制)。以3.2 Release版本为例:
  2. 搭建烧录环境。
    1. [完成DevEco Device Tool的安装]
    2. [完成RK3568开发板的烧录]
  3. 搭建开发环境。
    1. 开始前请参考[工具准备],完成DevEco Studio的安装和开发环境配置。
    2. 开发环境配置完成后,请参考[使用工程向导]创建工程(模板选择“Empty Ability”)。
    3. 工程创建完成后,选择使用[真机进行调测]。
    4. 鸿蒙开发指导文档:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

搜狗高速浏览器截图20240326151344.png

代码结构解读

本篇Codelab只对核心代码进行讲解,对于完整代码,我们会在gitee中提供。

HarmonyOS与OpenHarmony鸿蒙文档籽料:mau123789是v直接拿

├──entry/src/main/js	              // 代码区
│  └──MainAbility
│     ├──common
│     │  ├──constants
│     │  │  └──commonConstants.js     // 公共数据常量
│     │  └──images
│     ├──i18n		                  // 中英文	
│     │  ├──en-US.json			
│     │  └──zh-CN.json			
│     └──pages
│        └──index
│           ├──index.css              // 首页样式文件	
│           ├──index.hml              // 首页布局文件
│           └──index.js               // 首页脚本文件
└──entry/src/main/resources           // 应用资源目录

构建界面

本示例主界面由上至下分为三部分:顶部标题栏、中间图片区域、底部操作栏。

标题栏中的元素呈水平分布,包含“返回”图标、“编辑”标题和“保存”图标。div容器内元素默认为水平分布,开发者将对应元素置于div容器组件中即可。“返回”图标和“编辑”标题置于同一个子div容器中,组成一个新元素,与“保存”图标分别置于父div容器的水平两侧。

< !-- index.hml -- >
< !-- 顶部标题栏 -- >
< div class="title-container" >
    < div >
        < image src="/common/images/ic_back.png" class="image-back" >< /image >
        < text class="title-text" >{{ $t('strings.edit') }}< /text >
    < /div >
    < image src="/common/images/ic_save.png" class="image-save" >< /image >
< /div >
/* index.css */
.title-container {
    justify-content: space-between;
    width: 100%;
    padding-top: 13vp;
    padding-left: 26vp;
    padding-bottom: 15vp;
    padding-right: 24vp;
}

图片区域用于展示被编辑的图片,使用div容器组件限定区域范围。再通过设置样式,使范围内的图片居中展示。图片组件image设置object-fit属性为contain,确保图片保持宽高比缩放,并在区域内完整展示。

< !-- index.hml -- >
< !-- 图片区域 -- >
< div class="image-container" >
    < image id="picture" src="/common/images/ic_meals.png" class="picture" >< /image >
< /div >
/* index.css */
.image-container {
    justify-content: center;
    width: 100%;
    height: 68%;
    flex-direction: column;
    align-items: center;
}

.picture {
    object-fit: contain;
}

操作栏包含裁剪、旋转、缩放和镜像四种常见操作按钮。他们的布局和数据结构相同,可采用for循环的方式进行渲染。每个按钮的图标和文字都是垂直分布,也是通过设置对应样式达到效果。

< !-- index.hml -- >
< !-- 操作栏 -- >
< div >
    < div class="button-container" for="item in buttonList" on:click="pictureManipulation({{ item.buttonType }})" >
        < image src="{{ item.src }}" class="button-icon" >
        < /image >
        < text class="operation-text" >{{ item.description }}< /text >
    < /div >
< /div >
/* index.css */
.button-icon {
    width: 27vp;
    height: 27vp;
    margin-left: 24vp;
    margin-right: 24vp;
    margin-top: 52vp;
    margin-bottom: 6vp;
}

.operation-text {
    font-size: 12fp;
    color: #182431;
}

.button-container {
    justify-content: center;
    flex-direction: column;
    align-items: center;
    width: 100%;
}

编辑图片

使用指定元素的setStyle(name: string, value: string)方法,可以动态设置该元素样式。当前示例正是基于此方式,实现了对图片裁剪、旋转、缩放以及镜像操作。

  • 裁剪操作:使用clip-path样式,设置组件的裁剪区域,只显示区域内的部分,实现对图片的裁剪操作。
  • 旋转操作:使用transform动画样式,设置组件的旋转动画属性,实现对图片的旋转操作。
  • 缩放操作:动态等比例设置组件宽、高属性,实现对图片的缩放操作。
  • 镜像操作:使用transform动画样式,设置组件的Y轴方向旋转动画属性,实现对图片的旋转操作。
// index.js
pictureManipulation(buttonType) {
  if (this.isCropped || this.isRotated || this.isZoomed || this.isMirror) {
    this.$element('picture').setStyle('clipPath', 'inset(0, 0, 0, 0');
    this.$element('picture').setStyle('transform', 'rotate(0)');
    this.$element('picture').setStyle('height', this.imageHeight);
    this.$element('picture').setStyle('width', this.imageWidth);
    this.$element('picture').setStyle('transform', 'rotateY(0)');
    this.degrees = 0;
    this.rotateY = 0;
    this.isCropped = false;
    this.isRotated = false;
    this.isZoomed = false;
    this.isMirror = false;
  } else {
    switch (buttonType) {
      case CommonConstants.OperationType.CROP:
        this.$element('picture')
          .setStyle('clipPath', 'inset(0, 0, ' + (this.imageHeight / CommonConstants.SPLIT_IN_HALF) + ', 0');
        this.isCropped = true;
        break;
      case CommonConstants.OperationType.ROTATE:
        this.degrees = this.degrees + CommonConstants.ROTATE_DEGREE;
        this.$element('picture').setStyle('transform', 'rotate(' + this.degrees + ')');
        this.isRotated = true;
        break;
      case CommonConstants.OperationType.ZOOM:
        this.$element('picture').setStyle('height', this.imageHeight / CommonConstants.SPLIT_IN_HALF);
        this.$element('picture').setStyle('width', this.imageWidth / CommonConstants.SPLIT_IN_HALF);
        this.isZoomed = true;
        break;
      case CommonConstants.OperationType.MIRROR:
        this.rotateY = this.rotateY + CommonConstants.ROTATE_Y;
        this.$element('picture').setStyle('transform', 'rotateY(' + this.rotateY + ')');
        this.isMirror = true;
        break;
      default:
        hilog.info(0x0000, 'ImageOperation', '%{public}s', 'Operation type is wrong!');
        break;
    }
  }
}

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鸿蒙
    +关注

    关注

    55

    文章

    1651

    浏览量

    42132
  • HarmonyOS
    +关注

    关注

    79

    文章

    1864

    浏览量

    29274
  • OpenHarmony
    +关注

    关注

    23

    文章

    3328

    浏览量

    15172
收藏 人收藏

    评论

    相关推荐

    HarmonyOS开发案例:【图片编辑

    基于canvas组件、图片编解码,介绍了图片编辑实现过程。
    的头像 发表于 04-22 16:42 394次阅读
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>开发</b>案例:【<b class='flag-5'>图片</b><b class='flag-5'>编辑</b>】

    HarmonyOS开发必备知识

    这篇文档带领大家掌握HarmonyOS开发的一些必备基础知识:1、应用基础知识;2、应用配置文件;3、资源文件;4、应用数据管理;5、应用权限管理注:文档和视频中所有的图片及代码截图皆为示意图,具体以
    发表于 09-10 17:39

    HarmonyOS WLAN开发指南

    这次给大家带来的是HarmonyOS的WLAN开发文档,这篇文档主要包含以下知识:1、基础功能;2、消息通知;3、P2P功能开发。注:文档和视频中所有的图片及代码截图皆为示意图,具体以
    发表于 09-10 17:51

    HarmonyOS应用开发-代码编辑

    编辑器使用技巧DevEco Studio支持多种语言进行HarmonyOS应用的开发,包括Java、JS和C/C++。在编写应用阶段,您可以通过掌握各种代码编写的各种常用技巧,来提升编码效率。代码
    发表于 09-18 16:56

    HarmonyOS】应用开发文档

    /basic-fundamentals-0000000000041611快速入门补充该实例在新建工程时需要选择的设备类型和模板,避免开发者选择错误https://developer.harmonyos.com/cn/docs/d
    发表于 10-14 18:04

    绝对干货!HarmonyOS开发者日资料全公开,鸿蒙开发者都在看

    分享HarmonyOS三方库,组件使用方法,如何贡献组件。13、HarmonyOS 应用开发基础 - Ability:该主题讲解Ability的基本概念与开发
    发表于 08-04 14:36

    HarmonyOS教程—基于图片处理能力,实现一个图片编辑模板

    :界面UI和图片编辑器。模板界面UI部分主要为开发者提供了:图片编辑界面的设计参考,以及HarmonyO
    发表于 08-31 10:13

    华为开发HarmonyOS零基础入门:Word图片资源支持预览效果

    华为开发HarmonyOS零基础入门:Word图片资源支持预览效果,list主键函数可以做布局,呈现多个堆叠显示效果。
    的头像 发表于 10-23 10:12 1209次阅读
    华为<b class='flag-5'>开发</b>者<b class='flag-5'>HarmonyOS</b>零基础入门:Word<b class='flag-5'>图片</b>资源支持预览效果

    华为开发HarmonyOS零基础入门:UI组件设计开发实践

    华为开发HarmonyOS零基础入门:UI组件设计开发实践之图库应用介绍,应用数据加载显示模型图片加载渲染功能快速在其他应用上。
    的头像 发表于 10-23 10:58 1448次阅读
    华为<b class='flag-5'>开发</b>者<b class='flag-5'>HarmonyOS</b>零基础入门:UI组件设计<b class='flag-5'>开发</b>实践

    HarmonyOS Connect的智能硬件开发

    办公、HMS Core 等热门话题,与华为专家、行业大咖、全球开发者一起探讨全场景智慧体验的未来。 HarmonyOS Connect智能硬件开发 华为商城店铺化运营:为伙伴提供品牌私域运营阵地和工具 直播间:http://t.
    的头像 发表于 10-23 13:44 1960次阅读
    <b class='flag-5'>HarmonyOS</b> Connect的智能硬件<b class='flag-5'>开发</b>

    华为开发者大会2021 HarmonyOS设计人因研究框架

    今天的2021华为开发者大会上,HarmonyOS面向超级终端UX设计上展示了HarmonyOS设计人因研究框架。 HDC分论坛-HarmonyOS面向超级终端UX设计推荐链接:htt
    的头像 发表于 10-23 17:07 1318次阅读
    华为<b class='flag-5'>开发</b>者大会2021 <b class='flag-5'>HarmonyOS</b>设计人因研究框架

    华为开发者分论坛HarmonyOS学生公开课-HarmonyOS的无限可能

    2021华为开发者分论坛HarmonyOS学生公开课-HarmonyOS的无限可能   推荐链接:http://t.elecfans.com/live/1713.html 责任编辑:p
    的头像 发表于 10-24 11:03 1238次阅读
    华为<b class='flag-5'>开发</b>者分论坛<b class='flag-5'>HarmonyOS</b>学生公开课-<b class='flag-5'>HarmonyOS</b>的无限可能

    HarmonyOS开发:舒尔特方格游戏

    为丰富 HarmonyOS 对云端开发的支持、实现 HarmonyOS 生态端云联动,DevEco Studio 推出了云开发功能,开发者在
    的头像 发表于 06-19 15:05 508次阅读
    <b class='flag-5'>HarmonyOS</b>云<b class='flag-5'>开发</b>:舒尔特方格游戏

    OpenHarmony上实现图片编辑功能

    图片编辑是在应用中经常用到的功能,比如相机拍完照片后可以对照片进行编辑;截图后可以对截图进行编辑;可以对图库中的图片进行
    的头像 发表于 06-25 15:17 797次阅读
    OpenHarmony上实现<b class='flag-5'>图片</b><b class='flag-5'>编辑</b>功能

    HarmonyOS开发案例:【图片编辑

    基于ArkTS的声明式开发范式的样例,主要介绍了图片编辑实现过程。
    的头像 发表于 04-23 20:54 57次阅读
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>开发</b>案例:【<b class='flag-5'>图片</b><b class='flag-5'>编辑</b>】