当前位置: 首页 > news >正文

OpenHarmony 实战开发PhotoView——支持图片缩放、平移、旋转的一个优雅的三方组件

简介

PhotoView是OpenAtom OpenHarmony(简称“OpenHarmony”)系统的一款图片缩放及浏览的三方组件,用于声明式应用开发,支持图片缩放、平移、旋转等功能。

使用场景

PhotoView为广大OpenHarmony应用开发者在处理图片时,提供了很大的便利。当开发者需要对图片进行浏览、查看等处理时,只需要导入PhotoView三方组件,然后调用相关的接口就能实现效果,例如基于大禹200开发板开发的图库应用,就使用到了PhotoView三方库去处理图片。

效果展示

开发环境

安装IDE:支持DevEco Studio 3.0 Beta3(Build Version 3.0.0.901)及以上版本。

安装SDK:支持OpenHarmony API version 9 及以上版本

如何使用

1.下载PhotoView组件,在page页面导入
npm install @ohos/photoview --save;
import {PhotoView} from '@ohos/photoview';

2.生成Photo View

2.1创建model对象

aboutToAppear() {
this.data
.setImageResource($rawfile('wallpaper.jpg'))
.setScale(1, false)
.setImageFit(ImageFit.Contain)
.setOnPhotoTapListener({
onPhotoTap(x:number,y:number){
}
})
}

2.2设置图片源

aboutToAppear() {
this.data
.setImageResource($rawfile('wallpaper.jpg'))
.setScale(1, false)
.setImageFit(ImageFit.Contain)
.setOnPhotoTapListener({
onPhotoTap(x:number,y:number){
}
})
}
3.使用示例:

平移、缩放、旋转核心思想都是通过手势触发,然后获取图片变换前后的偏移量,最后更新图片的矩阵Matrix实现效果。

这里以平移为例说明:

PinchGesture() // 平移手势接口.onActionStart((event) => { console.log('photo PinchGesture start:' +
this.model.animate)}).onActionUpdate((event) => {console.info("photo pin:" +
JSON.stringify(event))if (this.model.isZoom) {var currentScale: number =
this.model.scale + event.scale - 1;console.log('photo PinchGesture update:'
+ currentScale)if (currentScale >
this.model.scaleMax) {this.model.scale = this.model.scaleMax} else if (currentScale <
this.model.scaleMin) {this.model.scale = this.model.scaleMin} else {this.model.scale = currentScale;}if (this.model.animate) {this.zoomTo(this.model.scale,
this.model.mZoomDuration)} else {this.model.updateMatrix();// 通过此方法更新矩阵值}}}).onActionEnd((event) => {if (this.model.scale <
this.model.scaleMin) {this.model.scale = this.model.scaleMin}if (this.model.scale >
this.model.scaleMax) {this.model.scale = this.model.scaleMax}this.model.isZooming = (this.model.scale
> 1)if (this.model.matrixChangedListener !=
null) {
this.model.matrixChangedListener.onMatrixChanged(this.model.rect)}if (this.model.scaleChangeListener != null)
{
this.model.scaleChangeListener.onScaleChange(this.model.scale, 0, 0)}})

调用UpdateMatrix( )方法

public updateMatrix():
void {this.rect.left = this.componentWidth / 2 -
(this.componentWidth * this.scale) / 2 + this.offsetX;this.rect.right = this.componentWidth / 2 +
(this.componentWidth * this.scale) / 2 + this.offsetX;this.rect.top = this.componentHeight / 2 -
(this.sHeight / 2) * this.scale + this.offsetY;this.rect.bottom = this.componentHeight / 2 +
(this.sHeight / 2) * this.scale + this.offsetY;this.matrix = Matrix4.identity().rotate({ x: 0, y: 0, z: 1, angle:
this.rotateAngle }).translate({ x: this.offsetX, y:
this.offsetY }).scale({ x: this.scale, y: this.scale,
centerX: this.centerX, centerY: this.centerY })
}

Matrix已更新,此时给图片更新矩阵即可。

Image(this.model.src).alt(this.model.previewImage).objectFit(this.model.imageFit).transform(this.model.matrix) // 传递更新后的矩阵值.interpolation(ImageInterpolation.Low)

demo源码及文件结构

文件目录结构如下

|---- PhotoView-ETS|---- entry
|     |---- pages  # 示例代码文件夹      |---- photoView
|     |---- components  # 库文件夹
|     |     |---- PhotoView.ets  #自定义组件                
|     |     |---- RectF.ets  # 区域坐标点数据封装
|     |---- README.md  # 安装使用方法

类结构

相关方法

结语

通过本篇文章介绍,您对OpenHarmony PhotoView组件应该有了初步的了解。我们所有的源码和指导文档都已经开源,如果您对本篇文章内容以及所实现的Demo感兴趣,可以根据本篇文章介绍自行下载OpenHarmony PhotoView源码进行研究和使用。同时也欢迎更多开发者与我们共享开发成果,分享技术解读与经验心得。

相关文章:

  • WXSS (WeiXin Style sheets)
  • Java中volatile关键字
  • 英语学习笔记22——Give me/him/her/us/them a .... Which one?
  • js处理服务器响应Blob对象格式文件处理
  • 【Unity】免费的高亮插件——QuickOutline
  • 【全开源】JAVA同城搬家系统源码小程序APP源码
  • Scrapy框架简单介绍及Scrapy项目编写详细步骤(Scrapy框架爬取豆瓣网站示例)
  • 在Ubuntu系统中使用Systemctl添加启动项的详细指南
  • Mybatis入门——其他查询操作和数据库连接池(4)
  • 【oracle】Oracle RAC中的GNS到底是什么?
  • ctfshow web入门 黑盒测试
  • linux input 驱动
  • 持续总结中!2024年面试必问 20 道 Rocket MQ面试题(二)
  • 语言模型的发展
  • 磁盘管理以及文件系统08
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Gradle 5.0 正式版发布
  • JavaScript-Array类型
  • Java应用性能调优
  • Promise面试题2实现异步串行执行
  • Python连接Oracle
  • react-native 安卓真机环境搭建
  • sessionStorage和localStorage
  • text-decoration与color属性
  • 彻底搞懂浏览器Event-loop
  • 解决iview多表头动态更改列元素发生的错误
  • 浅谈Golang中select的用法
  • 深入浏览器事件循环的本质
  • 微信支付JSAPI,实测!终极方案
  • 问题之ssh中Host key verification failed的解决
  • 小程序button引导用户授权
  • 用 Swift 编写面向协议的视图
  • 走向全栈之MongoDB的使用
  • 回归生活:清理微信公众号
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • (42)STM32——LCD显示屏实验笔记
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (Java入门)抽象类,接口,内部类
  • (WSI分类)WSI分类文献小综述 2024
  • (不用互三)AI绘画工具应该如何选择
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (四) Graphivz 颜色选择
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)