HarmonyOS Next开发----k线图滑动问题

news2024/11/16 21:39:15

前言

最近做股票软件鸿蒙版本的适配,K线趋势图的手势交互上遇到了问题,这里记录下~

功能需求:

实现k线趋势图滑动及fling的效果

思路:

1. 借鉴Flutter版本的思路,在K线趋势图上面叠加一个Scroll布局,使用系统提供给我们的Scroller来计算手势滑动及fling效果。
2. 监听滑动手势PanGesture来处理,fling的惯性滑动效果需要自己模拟计算。

 Scroll(this.mScroller) {
        Text('').width('100%')
      }
      .onAreaChange((oldValue: Area, newValue: Area)=>{
        this.mScroller.scrollEdge(Edge.End)
      })
      .height('100%')
      .width(this.getTotalKLineWidth() + 200)
      .scrollable(ScrollDirection.Horizontal)
      .scrollBar(BarState.On)
      .friction(0.5)
      .onScroll((xOffset, yOffset)=>{
          let result: boolean = this.mGestureHelper.scroll(this.mScroller.currentOffset().xOffset, this.getTotalKLineWidth());
          if (result) {
            this.onDraw();
          }
      })
      .gesture(GestureGroup(GestureMode.Parallel,
        LongPressGesture()
          .onAction((event?: GestureEvent) => {
            if (!this.mCanHorizontalScroll) {
              this.mCanHorizontalScroll = true;
            }
            this.setCrossState(UPMarketUIGestureHelper.CROSS_STATE_SHOW);
            this.mGestureHelper.updateCrossPoint(event?.fingerList[0].localX, event?.fingerList[0].localY);
            this.onDraw();
          })
          .onActionEnd((event?: GestureEvent) => {
            this.setCrossState(UPMarketUIGestureHelper.CROSS_STATE_NORMAL);
            this.onDraw();
          })
          .onActionCancel((event?: GestureEvent) => {
            this.setCrossState(UPMarketUIGestureHelper.CROSS_STATE_NORMAL);
            this.onDraw();
          })
      ), GestureMask.Normal)

由于k线趋势图初始位置是展示最新的k线,然而Scroller不能设置初始位置,尝试在onAreaChange中滑动到最后,但是会有动画效果,所以这个思路实现不了。

使用平移手势接口:

.gesture(GestureGroup(GestureMode.Parallel,
      PanGesture({ direction: this.mCanHorizontalScroll ? PanDirection.All : PanDirection.Horizontal, distance: 1})
        .onActionStart(() => {
          if (!this.mIsLongPressed) {
             this.mGestureHelper.startScroll();
          }
        })
        .onActionEnd(() => {
          this.mGestureHelper.stopScroll();
          this.onDraw();
        })
        .onActionUpdate((event?: GestureEvent) => {
          if (event) {
            if (this.mIsLongPressed) {
              let reallyOffsetX: number = event.offsetX - this.mLastOffsetX;
              let reallyOffsetY: number = event.offsetY - this.mLastOffsetY;
              this.mLastOffsetX = event.offsetX;
              this.mLastOffsetY = event.offsetY;

              this.mCrossTouchPoint.offset(reallyOffsetX, reallyOffsetY);
              this.mCrossTouchPoint.y = Math.max(this.mMainRenderTitleHeight + 1, this.mCrossTouchPoint.y);
              this.mCrossTouchPoint.y = Math.min(this.totalHeight - 1, this.mCrossTouchPoint.y);
              this.mGestureHelper.updateCrossPoint(this.mCrossTouchPoint.x, this.mCrossTouchPoint.y);
              this.onDraw();
            } else {
              if (this.mGestureHelper.scroll(event.offsetX, this.totalWidth)) {
                this.onDraw();
              }
            }
          }
        }),
      LongPressGesture()
        .onAction((event?: GestureEvent) => {
          if (!this.mCanHorizontalScroll) {
            this.mCanHorizontalScroll = true;
          }
          this.setCrossState(UPMarketUIGestureHelper.CROSS_STATE_SHOW);
          this.mCrossTouchPoint.set(event?.fingerList[0].localX, event?.fingerList[0].localY);
          this.mGestureHelper.updateCrossPoint(this.mCrossTouchPoint.x, this.mCrossTouchPoint.y);
          this.onDraw();
        })
        .onActionEnd((event?: GestureEvent) => {
          this.setCrossState(UPMarketUIGestureHelper.CROSS_STATE_NORMAL);
          this.onDraw();
        })
        .onActionCancel((event?: GestureEvent) => {
          this.setCrossState(UPMarketUIGestureHelper.CROSS_STATE_NORMAL);
          this.onDraw();
        }),
      PinchGesture()
        .onActionStart(() => {
          this.mGestureHelper.startScale();
        })
        .onActionUpdate((event) => {
          console.log("UPMarketUISDK  PinchGesture scale: " + event.scale);
          if(this.mGestureHelper.scale(event.scale)) {
            this.onDraw();
          }
        })
    ), GestureMask.Normal)

使用PanGesture也可以实现滑动效果,但是松手惯性滑动需要自己计算。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1435827.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL学习记录——사 表结构的操作

文章目录 1、创建表2、查看表结构3、改变表结构4、删除表5、总结 1、创建表 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; 例子 create table users ( id int, name varchar(20) c…

python-产品篇-游戏-玛丽冒险

文章目录 开发环境要求运行方法代码效果 开发环境要求 本系统的软件开发及运行环境具体如下。 (1)操作系统:Windows 7、Windows 8、Windows 10。 (2)Python版本:Python 3.7.0。 (3)…

109 C++ STL 分配器概述,使用,工作原理说明 非重点。

一。分配器allocator概述 分配器 (allocator) 是C STL库的基石之一,它是一种策略模式,允许用户将内存管理从容器中解耦出来,进行更具体化的操作。通过使用 allocator,我们可以自定义内存的分配和释放方式,从而可以更好…

Springboot 整合 Elasticsearch(二):使用HTTP请求来操作ES

📁前情提要:Springboot整合Elasticsearch(一):Linux下安装 Elasticsearch 8.x 上回说到,Elasticsearch 已经安装完成,不过我们使用7.17.5 版本继续后文: 一、使用 elasticsearch-hea…

【网站项目】037物流管理系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

Matlab:利用1D-CNN(一维卷积神经网络),分析高光谱曲线数据或时序数据

1DCNN 简介: 1D-CNN(一维卷积神经网络)是一种特殊类型的卷积神经网络,设计用于处理一维序列数据。这种网络结构通常由多个卷积层和池化层交替组成,最后使用全连接层将提取的特征映射到输出。 以下是1D-CNN的主要组成…

Mac最实用的日常快捷键,最方便快捷的Mac使用技巧合集

今天小编给大家分享一下这几年来使用Mac过程中的各种小技巧。,大家不用担心,下面的各种小技巧在apple其他各型号电脑中几乎也是都是通用的,话不多说,下面开始! 屏幕相关 (1)截屏 ctrlshift3 截…

jsp商场会员卡管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 商场会员卡管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.…

计组学习笔记2024/2/5

1. 2. 3. 1.这么多步,才完成第一条指令,通过0索引来找到2 2.PC的值是对应着MAR来的,为了更好地找到地址 3.操作码, 地址码这些东西都是放在存储体里面的 MAR和MDR只是一个中转站 MAR对应着拿到各个部件给出的主存地址 MDR对应着拿到各个部件给出的指令 4.取指令完成后就自…

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(五)NodeJS入门——http模块

044_http模块_创建HTTP服务端 hello,大家好,那这个小节我们来使用 nodejs 创建一个 http 的服务,有了这个 http 服务之后,我们就可以处理浏览器所发送过来的请求,并且还可以给这个浏览器返回响应。 顺便说一下&#x…

数据分析基础之《pandas(5)—文件读取与存储》

一、概述 1、我们的数据大部分存在于文件当中,所以pandas会支持复杂的IO操作,pandas的API支持众多文件格式,如CSV、SQL、XLS、JSON、HDF5 二、CSV 1、读取csv文件 read_csv(filepath_or_buffer, sep,, delimiterNone) 说明: fi…

<.Net>使用visual Studio 2022在VB.net中新添自定义画图函数(优化版)

前言 这是基于我之前的一篇博文: 使用visual Studio 2019在VB.net中新添自定义画图函数 在此基础上,我优化了一下,改进了UI,添加了示例功能,即以画圆函数为基础,添加了走马灯功能。 先看一下最终效果&#…

在线JSON解析格式化工具

在线JSON解析格式化工具 - BTool在线工具软件,为开发者提供方便。JSON在线可视化工具:提供JSON视图,JSON格式化视图,JSON可视化,JSON美化,JSON美化视图,JSON在线美化,JSON结构化,JSON格式化,JSON中文Unicode等等。以清晰美观的结构化视图来展示json,可伸缩折叠展示,…

【Linux】Linux权限(下)

Hello everybody!在上一篇文章中,权限讲了大部分内容。今天继续介绍权限剩下的内容,希望大家看过这篇文章后都能有所收获! 1.更改文件的拥有者和所属组 对于普通用户,文件的拥有者和所属组都无权修改。 、 、 但root可以修改文件…

071:vue中过滤器filters的使用方法(图文示例)

第071个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 提供vue2的一些基本操作:安装、引用,模板使用,computed&a…

双侧条形图绘制教程

写在前面 双侧条形图在我们的文章中也是比较常见的,那么这样的图形是如何绘制的呢? 以及它使用的数据类型是什么呢? 这些都是我们在绘制图形前需要掌握的,至少我们知道绘图的数据集如何准备,这样才踏出第一步。 今天…

Unity接入GVoice腾讯实时语音

Unity接入GVoice腾讯实时语音 一、介绍二、注册GVoice创建项目语音服务1.创建项目2.申请语音权限3.项目管理查看SDK初始化的一些参数和基本信息4.GVoice检测 三、SDK下载SDK是分为两种类型:独立版集成板 SDK放入Unity工程中 四、语音代码写法五、GVoice踩坑语音权限…

知到如何找答案?这7款足够解决问题 #笔记#其他

在这个信息爆炸的时代,合理利用学习工具可以帮助我们过滤和获取有用的知识。 1.网易公开课 这是一个可以帮你找到国内外演讲课程的学习APP,提供了多个专业的视频课程,而且还有丰富的TED、精品国外英语纪录片等。 其中涵盖的大学专业课程包…

ClickHouse基于数据分析常用函数

文章标题 一、WITH语法-定义变量1.1 定义变量1.2 调用函数1.3 子查询 二、GROUP BY子句(结合WITH ROLLUP、CUBE、TOTALS)三、FORM语法3.1表函数3.1.1 file3.1.2 numbers3.1.3 mysql3.1.4 hdfs 四、ARRAY JOIN语法(区别于arrayJoin(arr)函数&a…

Java开发IntelliJ IDEA2023

IntelliJ IDEA 2023是一款强大的集成开发环境(IDE),专为Java开发人员设计。它提供了许多特色功能,帮助开发人员更高效地编写、测试和调试Java应用程序。以下是一些IntelliJ IDEA 2023的特色功能: 智能代码编辑器&…