使用MovingPhotoView播放动态照片
系统提供了MovingPhotoView组件,在一些社交类、图库类应用中,可用于播放动态照片文件。
约束与限制
针对MovingPhotoView组件的使用,有以下约束与限制:
- 当前不支持动态属性设置。
- 当前不支持设置ArkUI通用属性expandSafeArea。
- 该组件长按触发播放时组件区域放大为1.1倍。
- 该组件使用AVPlayer进行播放,同时开启的AVPlayer个数不建议超过3个,超过3个可能会出现视频播放卡顿现象。
开发步骤
-
导入动态照片模块。
- MovingPhotoViewAttribute是用于配置MovingPhotoView组件属性的关键接口。API version 21及之前版本,导入MovingPhotoView组件后需要开发者手动导入MovingPhotoViewAttribute,否则会编译报错。从API version 22开始,编译工具链识别到导入MovingPhotoView组件后,会自动导入MovingPhotoViewAttribute,无需开发者手动导入。
- MovingPhotoViewAttribute导入后,DevEco Studio会将其显示置灰,不影响开发者使用。
API version 21及之前版本:
import { MovingPhotoView, MovingPhotoViewController, MovingPhotoViewAttribute } from '@kit.MediaLibraryKit';API version 22及之后版本:
import { MovingPhotoView, MovingPhotoViewController } from '@kit.MediaLibraryKit'; -
获取动态照片对象(MovingPhoto)。
MovingPhoto对象需要通过photoAccessHelper接口创建或获取,MovingPhotoView只接收构造完成的MovingPhoto对象。
创建、获取的方式可参考访问和管理动态照片资源。
src: photoAccessHelper.MovingPhoto | undefined = undefined; -
创建动态照片控制器(MovingPhotoViewController),用于控制动态照片的播放状态(如播放、停止)。
controller: MovingPhotoViewController = new MovingPhotoViewController(); -
创建动态照片组件。
以下参数取值仅为举例,具体每个属性的取值范围,可参考API文档:@ohos.multimedia.movingphotoview。
// API version 21及之前版本导入方式:import { photoAccessHelper, MovingPhotoView, MovingPhotoViewController, MovingPhotoViewAttribute } from '@kit.MediaLibraryKit';// API version 22及之后版本导入方式如下:import { photoAccessHelper, MovingPhotoView, MovingPhotoViewController } from '@kit.MediaLibraryKit';@Entry@Componentstruct Index {@State src: photoAccessHelper.MovingPhoto | undefined = undefined@State isMuted: boolean = falsecontroller: MovingPhotoViewController = new MovingPhotoViewController();build() {Column() {MovingPhotoView({movingPhoto: this.src,controller: this.controller})// 是否静音播放,此处由按钮控制,默认值为false非静音播放。.muted(this.isMuted)// 视频显示模式,默认值为Cover。.objectFit(ImageFit.Cover)// 播放时触发。.onStart(() => {console.info('onStart');})// 播放结束触发。.onFinish(() => {console.info('onFinish');})// 播放停止触发。.onStop(() => {console.info('onStop')})// 出现错误触发。.onError(() => {console.error('onError');})Row() {// 按钮:开始播放。Button('start').onClick(() => {this.controller.startPlayback()}).margin(5)// 按钮:停止播放。Button('stop').onClick(() => {this.controller.stopPlayback()}).margin(5)}.alignItems(VerticalAlign.Center).justifyContent(FlexAlign.Center).height('15%')}}}
效果展示
