首页 > 其他分享 >鸿蒙+next+基于@xwf+image_preview+V1

鸿蒙+next+基于@xwf+image_preview+V1

时间:2024-12-19 09:11:33浏览次数:8  
标签:COUNT index scaleList image number next V1 proxy position

鸿蒙 next 基于@xwf/image_preview(V1.0.1)开发自己的功能

@xwf/image_preview(V1.0.1)的链接为: https://ohpm.openharmony.cn/#/cn/detail/@xwf%2Fimage_preview/v/1.0.1

前提背景

图片预览我们使用到了@xwf/image_preview库,用于预览图片可以进行手势放大,但是我们需要以弹窗的形式显示预览图片,而不是通过跳转页面的形式来显示预览图片。我们尝试使用 ImageItemView 组件但是发现报错,因为该组件使用到了 @Cousmer,并且我们需要单击预览的时候返回页面,而不是切换黑白模式。所以基于以上原因我们将该版本复制到自己的工程并进行修改。

使用MyImageItemView 组件

  1. 复制代码后,将ImageItemView重命名为MyImageItemView,将ImagePreview重命名为MyImagePreview。

  2. 将MyImageItemView 的@Cousume 的代码进行删除

  3. 添加 onSingleClickBg 事件

MyImagePreview 的完整代码:

import { CommonConstants } from '../constants/CommonConstants';
import { ImagePreviewOption, ImageType } from '../model/ImagePreviewOption';
import { MyImageItemView } from './MyImageItemView';

@Component
export struct MyImagePreview {
  //图片数据
  option: ImagePreviewOption = { images: [], index: 0 }
  //指示器样式
  indicator: DotIndicator | DigitIndicator | boolean = new DotIndicator().color(Color.Gray).selectedColor(Color.Blue)
  //页标改变监听
  onChange: (index: number) => void = () => {
  }
  onSingleClickBg?: () => void
  private DISPLAY_COUNT: number = 1
  private MIN_SCALE: number = 0.75
  @State private opacityList: number[] = []
  @State private scaleList: number[] = []
  @State private translateList: number[] = []
  @State private zIndexList: number[] = []
  @State private bgc: Color = Color.Black;

  aboutToAppear(): void {


    for (let i = 0; i < this.option.images.length; i++) {
      this.opacityList.push(1.0)
      this.scaleList.push(1.0)
      this.translateList.push(0.0)
      this.zIndexList.push(0)
    }
  }

  build() {
    Stack() {
      Swiper() {
        ForEach(this.option.images, (image: ImageType, index: number) => {
          MyImageItemView({ url: image, onSingleClickBg: this.onSingleClickBg })
            .width(CommonConstants.THOUSANDTH_1000)
            .height(CommonConstants.THOUSANDTH_1000)
            .opacity(this.opacityList[index])
            .scale({ x: this.scaleList[index], y: this.scaleList[index] })
            .translate({ x: this.translateList[index] })
            .zIndex(this.zIndexList[index])
        })
      }
      .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
      .width(CommonConstants.THOUSANDTH_1000)
      .height(CommonConstants.THOUSANDTH_1000)
      .loop(false)
      .indicator(this.option.images.length > 1 ? this.indicator : false)
      .displayCount(this.DISPLAY_COUNT, true)
      .index(this.option.index)
      .customContentTransition({
        // 页面移除视窗时超时1000ms下渲染树
        timeout: 1000,
        // 对视窗内所有页面逐帧回调transition,在回调中修改opacity、scale、translate、zIndex等属性值,实现自定义动画
        transition: (proxy: SwiperContentTransitionProxy) => {
          if (proxy.position <= proxy.index % this.DISPLAY_COUNT ||
            proxy.position >= this.DISPLAY_COUNT + proxy.index % this.DISPLAY_COUNT) {
            // 同组页面往左滑或往右完全滑出视窗外时,重置属性值
            this.opacityList[proxy.index] = 1.0
            this.scaleList[proxy.index] = 1.0
            this.translateList[proxy.index] = 0.0
            this.zIndexList[proxy.index] = 0
          } else {
            // 同组页面往右滑且未滑出视窗外时,对同组中左右两个页面,逐帧根据position修改属性值,实现两个页面往Swiper中间靠拢并透明缩放的自定义切换动画
            if (proxy.index % this.DISPLAY_COUNT === 0) {
              this.opacityList[proxy.index] = 1 - proxy.position / this.DISPLAY_COUNT
              this.scaleList[proxy.index] =
                this.MIN_SCALE + (1 - this.MIN_SCALE) * (1 - proxy.position / this.DISPLAY_COUNT)
              this.translateList[proxy.index] =
                -proxy.position * proxy.mainAxisLength + (1 - this.scaleList[proxy.index]) * proxy.mainAxisLength / 2.0
            } else {
              this.opacityList[proxy.index] = 1 - (proxy.position - 1) / this.DISPLAY_COUNT
              this.scaleList[proxy.index] =
                this.MIN_SCALE + (1 - this.MIN_SCALE) * (1 - (proxy.position - 1) / this.DISPLAY_COUNT)
              this.translateList[proxy.index] = -(proxy.position - 1) * proxy.mainAxisLength -
                (1 - this.scaleList[proxy.index]) * proxy.mainAxisLength / 2.0
            }
            this.zIndexList[proxy.index] = -1
          }
        }
      })
      .onChange((index) => {
        //this.option.index = index
        this.onChange(index)
      })

      // .onContentDidScroll((selectedIndex: number, index: number, position: number, mainAxisLength: number) => {
      //   // 监听Swiper页面滑动事件,在该回调中可以实现自定义导航点切换动画等
      //   //Logger.info("onContentDidScroll selectedIndex: " , selectedIndex + ", index: " + index + ", position: " + position + ", mainAxisLength: " + mainAxisLength)
      // })
    }
    .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
    .backgroundColor(this.bgc)
    .width(CommonConstants.THOUSANDTH_1000)
    .height(CommonConstants.THOUSANDTH_1000)
  }
}

标签:COUNT,index,scaleList,image,number,next,V1,proxy,position
From: https://www.cnblogs.com/hongmengos/p/18616330

相关文章

  • HarmonyOS Next 系统能力调用简易指南
    《HarmonyOSNext系统能力调用简易指南》HarmonyOSNext作为华为鸿蒙操作系统的下一代重要演进,为开发者带来了更强大、更高效且更具创新性的系统能力。在这篇文章中,我们将深入探讨如何简易地调用HarmonyOSNext的一些关键系统能力,并通过代码示例帮助您快速上手。一、基础环......
  • RV1126平台下的MobileSeg量化指南:高效部署低算力硬件
    1引言MobileSeg系列模型采用编解码架构,并以轻量级模型作为骨干网络,专为低算力硬件(如BPU、NPU、ARMCPU等)设计。这使得MobileSeg在边缘设备和移动端应用中表现出色,具备高效能和灵活性。本文将以MobileSeg分割模型为例,详细讲解如何在RV1126平台上进行模型量化操作,最大化发挥......
  • CVPR-23 Towards Universal Fake Image Detectors that Generalize Across Generative
    论文标题:TowardsUniversalFakeImageDetectorsthatGeneralizeAcrossGenerativeModels论文链接:https://arxiv.org/abs/2302.10174 01摘要翻译随着生成模型的快速发展,人们对通用假图像检测器的需求日益增长。在这项工作中,我们首先展示了现有的模式,即训练一个深......
  • 链表的错误处理之没把地址给到next
    void add_end_node(Node_t*head,intdata)//这里是在尾部添加节点{  Node_t*newnode=(Node_t*)malloc(sizeof(Node_t));  if(!newnode)  {    exit(1);  }  newnode->data=data;  newnode->next=NULL;  Node_t*cur=(No......
  • ERPNext version 15 虚拟机镜像下载
     虚拟机镜像ERPNEXTv15OVF镜像,可用VMWareWorkStation、VMWareFusion(Intel芯片)、vSphere/EXSI、MicrosoftHyper-V(通过SystemCenterVirtualMachineManager)、OracleVirtualBox虚拟机导入使用。虚拟机镜像下载:https://url43.ctfile.com/f/62348743-1433643665-14e4......
  • 鸿蒙 next arkts 实现防抖节流功能
    鸿蒙next-arkts-实现防抖节流功能ClickUtilexportclassClickUtil{privateconstructor(){}privatestaticthrottleTimeoutID:number;//节流timeoutIDprivatestaticflag:boolean=false;//节流flag,true=已经进入执行状态了privatestaticdebounc......
  • Flutter OHOS flutter_image_crop(图片裁剪)
    Flutter的图片裁剪插件该插件附带一个Crop小部件。该小部件仅渲染图像、叠加层和用于裁剪图像的句柄。因此,它可以与其他小部件组合以构建自定义图像裁剪体验。使用创建一个小部件来加载和编辑图像:finalcropKey=GlobalKey<CropState>();Widget_buildCropImage(){r......
  • 《DNK210使用指南 -CanMV版 V1.0》第四十四章 人脸68关键点检测实验
    第四十四章人脸68关键点检测实验1)实验平台:正点原子DNK210开发板2)章节摘自【正点原子】DNK210使用指南-CanMV版V1.03)购买链接:https://detail.tmall.com/item.htm?&id=7828013987504)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html......
  • antd使用Image加载图片失败后重试
    使用antdImage加载多张图片时,遇到网络之类的问题,导致图片加载失败,希望能重试3次,之后再展示默认图片代码如下:constretry={}consthandleError=(e,id,url)=>{letcur=retry[id]retry[id]=cur?++cur:1;if(retry[id]>=3){console.l......
  • 鸿蒙+next实现页签栏平板端适配
    鸿蒙next实现页签栏平板端适配1.在应用启动时通过updateBreakpoint获取当前窗口尺寸断点//根据当前窗口尺寸更新断点privateupdateBreakpoint(windowWidth:number):void{//拿到当前窗口对象获取当前所在displayId注释该代码原因:会在真机平板中报错//le......