ArkUI(ETS)openHarmony 自定义图片查看组件

前言

日常开发中,经常会遇到一些图片查看的需求,此时有的用户习惯放大图片来看,那么在ets中如何实现呢?今日分享的组件由subsampling-scale-image-view+swiper来实现深度缩放视图、图像显示、手势平移缩放双击等。

项目说明

本组件界面搭建基于ArkUI中TS扩展的声明式开发范式,官网官方文档地址:基于TS扩展的声明式开发范式1基于TS扩展的声明式开发范式2

工具版本:DevEco Studio 3.0 Beta2 SDK版本:3.0.0.1(API Version 7 Beta2)

主要功能

  • 双击放大图片
  • 如果图片已经是放大状态,双击恢复原图大小
  • 点击下方缩略图列表,可查看对应图片
  • 可旋转查看图片,每次旋转90度
  • 点击箭头可查看上一组缩略视图和下一组缩略视图

效果展示

OpenHarmony npm包

OpenHarmony js/ts三方库使用的是OpenHarmony npm包,它是在传统的npm包的基础上,定义了OpenHarmony npm共享包特定的工程结构和配置文件,支持OpenHarmony页面组件相关API、资源的调用。通过OpenHarmony npm包,您可以实现多个模块或者多个工程共享OpenHarmony页面、资源等相关代码。

OpenHarmony npm共享包的实现依赖于npm,因此您需要了解和掌握npm的基础功能和机制,可通过npm官方文档进行了解

如何安装OpenHarmony npm包

设置 OpenHarmony推荐的npm专用仓库(如果使用DevEco Studio 3.0 Beta3及以上版本的命令行窗口,则可忽略此步骤)

npm config set @ohos:registry=https://repo.harmonyos.com/npm/

在命令行工具中,执行如下命令进行安装,如安装subsampling-scale-image-view三方库,依赖包会存储在工程的node_modules目录下@ohos\subsampling-scale-image-view下。

npm install @ohos/subsampling-scale-image-view --save

在package.json中会自动添加如下依赖:

"dependencies": {
  "@ohos/subsampling-scale-image-view": "^1.0.0",
}

使用说明

import {SubsamplingScaleImageView} from '@ohos/subsampling-scale-image-view';
...
//创建model对象
@State model: SubsamplingScaleImageView.Model  = new SubsamplingScaleImageView.Model()

//设置图片源
 private aboutToAppear() {
 this.model.setImage($r("app.media.apple"));
 }
...
//使用SubsamplingScaleImageView组件
SubsamplingScaleImageView({ model: this.model })
...

主要用到的接口

接口描述
setZoomEnabled(zoomEnabled: boolean)设置图片是否可缩放
public setPanEnabled(panEnabled: boolean)设置图片是否可平移
public setMaxScale(maxScale: number)设置图片最大缩放比
public setOrientation(degrees: number)设置图片旋转角度
public getSWidth()获取图片高度
public getSHeight()获取图片高度
public setSingleTapListener(listener: OnSingleTapListener)单击图片监听器
public setLongPressListener(listener: OnLongPressListener)长按图片监听器
public setDoubleTapListener(listener: OnDoubleTapListener)双击图片监听器

设置图片资源

public setImage(src: string | PixelMap | Resource)
public setImage(src: string | PixelMap | Resource, previewSource: string | Resource)
public setImage(src: string | PixelMap | Resource, state: ImageViewState)

接口使用案例

//单击事件监听
this.model.setSingleTapListener({
    onSingleTapConfirmed(event: ClickEvent) {
    console.log("单击我了")
    }
})
// 长按事件监听
this.model.setLongPressListener({
      onLongPress(event: GestureEvent) {
        console.log("长按我了");
      }
})
// 双击事件监听
this.model.setDoubleTapListener({
      onDoubleTap(event: GestureEvent) {
        console.log("双击我了")
      }
})

轮播区域使用Stack布局

/**
* Stack堆叠容器,子组件按照顺序依次入栈,后一个子组件覆盖前一个子组件。
*/
 build() {
    Stack({ alignContent: Alignment.Bottom }) {
      SubsamplingScaleImageView({ model: this.model })
      Column({ space: 5 }) {
        Swiper(this.swiperController) {
          Row({ space: 5 }) {
            Image($r('app.media.previous'))
              .width(30)
              .height(30)
              .margin({ top: 6 ,left:10})
              .onClick((event: ClickEvent) => {
                this.index = 2;
                this.model.setImage($r('app.media.cake'));
              })
 }.width('100%').height(60).backgroundColor(0x3d3d3d)
	...
}.index(this.index)
        .autoPlay(false)
        .indicator(false) // 默认开启指示点
        .loop(true) // 默认开启循环播放
        .duration(50)
        .vertical(false) // 默认横向切换
        .itemSpace(0)
        .onChange((index: number) => {
          console.log('当前下标'+index)
          ...
        })
      }.height(60).backgroundColor(0x3d3d3d).align(Alignment.Bottom)
    }
  }
}

点击旋转按钮,每次旋转90度

Image($r('app.media.rotate'))
              .width(30)
              .height(30)
              .margin({ top: 6 ,left:70,right:2})
              .onClick((event: ClickEvent) => {
                this.rotate +=90;
                this.model.setOrientation(this.rotate)
              })

subsampling-scale-image-view组件目录结构

|---- subsampling-scale-image-view 
    |---- src
    |     |---- main        
    |     |------- ets  
    |     |     |---- components  # 库文件夹               
    |     |     |     |---- SubsamplingScaleImageView.ets  # 自定义组件                        
    |     |     |     |---- ImageViewState.ets  # 组件状态数据封装类                 

总结

此组件主要实现深度缩放视图、图像显示、手势平移缩放双击等。

  • subsampling-scale-image-view:深度缩放视图、图像显示、手势平移缩放双。
  • swiper图片轮播。
  • setOrientation设置旋转角度。

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

### OpenHarmony高级组件的功能与定义 OpenHarmony 的高级组件通常是指基于 ArkUI 开发框架构建的一系列复杂 UI 组件,这些组件不仅提供了基本的视觉展示能力,还集成了更多的交互逻辑和业务场景支持。以下是关于 OpenHarmony 高级组件的一些核心功能及其定义: #### 1. **复合组件** 复合组件是由多个基础组件组合而成的更复杂的 UI 构建单元[^4]。它们可以封装常见的布局模式、样式以及行为逻辑,从而减少开发者重复编写相似代码的工作量。例如 `SubHeader` 是一种典型的复合组件,用于在页面中创建带有子标题的部分。 ```typescript // 使用 SubHeader 复合组件的例子 import { SubHeader } from '@ohos.subheader'; @Entry @Component struct ExampleComponent { build() { Column() { SubHeader({ title: 'Example Title' }) Text('This is a sub-header example.') .fontSize(20) .margin({ top: 10 }) } .width('100%') .height('100%') } } ``` #### 2. **自定义图片查看器** 通过扩展 ArkUI 提供的基础组件开发者能够轻松实现更加灵活的图像处理工具。比如,在引用材料中有提到如何利用 ETS 创建一个增强型的图片浏览控件[^2]。这种类型的高级组件允许用户放大缩小照片、旋转视角甚至标注重点区域等功能。 #### 3. **网络请求管理** 对于现代移动应用程序而言,高效的数据交换至关重要。因此,像 Axios 这样的第三方 HTTP 客户端也被集成到了 OpenHarmony 生态当中[^3]。借助此类库的帮助,我们可以简化跨平台 API 调用过程并提高程序性能表现。 #### 4. **图形编辑插件 - ImageKnife** 作为一款专注于图像裁剪操作的专业解决方案,“ImageKnife” 展现出了卓越的技术实力[^5]。该模块具备精准切割线条绘制选项的同时还能保持良好的用户体验流畅度;另外值得注意的是其兼容性强,能够在不同版本环境下稳定运行。 --- ### 总结说明 综上所述,OpenHarmony 中所谓的 “高级组件”,实际上涵盖了从界面设计到数据通信再到媒体处理等多个层面的内容集合体。每一个单独部分都经过精心打磨以满足实际应用场景需求为导向进行优化改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值