新闻详情

新闻详情

首页 / 资讯中心 / 详情

鸿蒙图表MarkerView遮挡解决方案

发布时间:2026/9/11 21:55:04来源:尧图网络
鸿蒙图表MarkerView遮挡解决方案
鸿蒙项目接入了ohos/mpchart图表框架在实现MarkerView时出现了MarkerView被遮挡问题体验感不佳查找官方文档没有一个有效的设置方式以下是被遮挡截图解决方案使用ArkTS中的Stack包裹图表控件在包裹一个Stack组件用于Popup来实现气泡效果Stack |--- LineChart |--- Stack().bindPopup用于实现MarkerView效果前置依赖准备先通过鸿蒙ohpm命令安装ohos/mpchart三方库确保版本为最新版我这里用的是V3.0.30该版本已适配HarmonyOS NEXT的API接口规范。导入所需核心类AxisDependency、EntryOhos、LineChart、LineChartModel、OnChartValueSelectedListener等图表相关APIohpm i ohos/mpchart状态变量定义通过OnChartValueSelectedListener回调在用户点击/长按图表数据点时同步获取数据信息和屏幕像素坐标Entry ComponentV2 struct LineChartDemo { // 线形图配置构建类 Local lineChartModel: LineChartModel | undefined undefined; // Popup气泡位置 Local positionX: number 0; Local positionY: number 0; // 选中点的Popup气泡文字描述 Local popupMessage: string ; // 气泡显示控制变量 Local showUI: boolean false; Local handlePopup: boolean false; // 图表数据选择监听事件 private valueSelectedListener: OnChartValueSelectedListener { onValueSelected: (e: EntryOhos, h: Highlight) { // 触发气泡显示 this.showUI true; // 格式化获取选中点的Popup气泡文字描述 this.popupMessage ${e.getData()?.toString()}\n${e.getY().toFixed(2)}元; // 转换数据点为屏幕像素坐标 this.positionX this.lineChartModel?.getTransformer(AxisDependency.LEFT)?.getPixelForValues(e.getX(), e.getY()).x ?? 0; this.positionY this.lineChartModel?.getTransformer(AxisDependency.LEFT)?.getPixelForValues(e.getX(), e.getY()).y ?? 0; this.handlePopup true; }, onNothingSelected: () { // 取消选中时隐藏气泡 this.showUI false; this.handlePopup false; this.popupMessage ; } } }图表基础初始化在aboutToAppear生命周期中完成图表数据和基础样式配置aboutToAppear(): void { this.lineChartModel new LineChartModel(); this.lineChartModel.setOnChartValueSelectedListener(this.valueSelectedListener); this.lineChartModel.setHitTestMode(HitTestMode.Block); this.lineChartModel.setExtraOffsets(10, 10, 10, 10); this.lineChartModel.setNoDataText(没有可查看数据); //不显示图表描述信息 this.lineChartModel.getDescription()?.setEnabled(false); //不支持图表缩放 this.lineChartModel.setScaleEnabled(false); this.lineChartModel.animateXY(500, 500); // 改变y标签的位置 let leftAxis this.lineChartModel.getAxisLeft(); if (leftAxis) { leftAxis.setAxisMinimum(0); const color ColorUtil.parseColor(#e5e5e5); leftAxis.setAxisLineColor(color); leftAxis.setGridColor(color); leftAxis.setValueFormatter(new leftAxisValueFormatter()); } //右y轴不显示 this.lineChartModel.getAxisRight()?.setEnabled(false); //x坐标轴 let xAxis this.lineChartModel.getXAxis(); if (xAxis) { const color ColorUtil.parseColor(#e5e5e5); xAxis.setPosition(XAxisPosition.BOTTOM); xAxis.setAxisLineColor(color); xAxis.setGridColor(color); } //获取图表的图例 let legend this.lineChartModel.getLegend(); if (legend) { legend.setForm(LegendForm.LINE); // 图例换行 legend.setWordWrapEnabled(true); //图例设置在下方 legend.setVerticalAlignment(LegendVerticalAlignment.BOTTOM); legend.setDrawInside(false); legend.setFormSize(8); legend.setFormToTextSpace(4); legend.setXEntrySpace(6); } const days 30; // 测试数据 let dataSetList new JArrayListILineDataSet(); let entryList new JArrayListEntryOhos(); for (let day 1; day (days 1); day) { const date 9月${day}日; const entry new EntryOhos(day, Math.floor(Math.random() * 200), undefined, date); everyDayEntryList.add(entry); } let label 标签; let lineDataSet new LineDataSet(entryList, label); lineDataSet.setMode(LineDataSetMode.HORIZONTAL_BEZIER); lineDataSet.setCubicIntensity(0.2); lineDataSet.setDrawFilled(true); lineDataSet.setDrawCircles(true); lineDataSet.setLineWidth(1); lineDataSet.setCircleRadius(3); lineDataSet.setCircleHoleRadius(2); lineDataSet.setHighlightEnabled(true); lineDataSet.setCircleColor(ColorUtil.parseColor(#f2ad0b)); lineDataSet.setCircleHoleColor(Color.White); lineDataSet.setColorByColor(ColorUtil.parseColor(#f2ad0b)); lineDataSet.setFillColor(ColorUtil.parseColor(#3bf2ad0b)); dataSetList.add(lineDataSet); let lineData new LineData(dataSetList); lineData.setDrawValues(false); this.lineChartModel.setData(lineData); this.lineChartModel.invalidate(); }气泡绑定实现在build方法中通过bindPopup方法将气泡与选中点位置绑定实现跟随数据点展示的效果build() { Column() { Stack() { LineChart({ model: this.lineChartModel }) .width(100%) .height(100%) if (this.showUI) { // 占位元素用于锚定Popup气泡位置 Stack() .width(1) .height(1) .position({ x: this.positionX, y: this.positionY }) .bindPopup(this.handlePopup, { message: this.popupMessage, messageOptions: { font: { size: 10 }, textColor: #FFFFFF }, radius: 5, placementOnTop: true, popupColor: #8E8E8E, backgroundBlurStyle: BlurStyle.NONE, onStateChange: (e) { // 气泡关闭时同步取消图表选中状态 if (!e.isVisible) { this.handlePopup false; this.lineChartModel?.highlightValueForObject(null); } } }); } } .width(100%) .height(311) }.padding(15) .width(100%) .height(100%) }自定义样式扩展可以通过修改Popup配置项实现更多自定义效果调整placement参数控制气泡在数据点的上下方位自定义气泡的背景色、文字大小、圆角等样式
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

专科生AI论文平台测评:9大工具实战指南 2026/9/11 22:40:11

专科生AI论文平台测评:9大工具实战指南

1. 项目概述:AI论文平台测评的价值与意义去年指导专科生毕业论文时,我发现超过80%的学生在文献检索阶段就陷入困境——要么在付费墙前止步,要么被低质量预印本误导。这促使我系统测评当前主流的9个AI论文平台,特别关注对专科生的友…

阅读更多 →
基于AT89C52的智能窗帘系统:从最小系统到状态机控制 2026/9/11 22:40:11

基于AT89C52的智能窗帘系统:从最小系统到状态机控制

简介:基于AT89C52单片机的智能窗帘系统完整项目资料包,适用于单片机课程设计、毕业设计及电子设计竞赛备赛。系统集成LCD1602液晶显示、红外人体检测、DHT11温湿度采集、MQ2烟雾浓度探测、步进电机与蜂鸣器,可实现光线强弱自动开关窗、按键调…

阅读更多 →
OneKGPd 命令参考与实战指南:在 scientific-agent-skills 中基于 1000 Genomes Project 做个体级变异查询 2026/9/11 22:40:11

OneKGPd 命令参考与实战指南:在 scientific-agent-skills 中基于 1000 Genomes Project 做个体级变异查询

OneKGPd 命令参考与实战指南:在 scientific-agent-skills 中基于 1000 Genomes Project 做个体级变异查询 【免费下载链接】scientific-agent-skills Turn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000 scientist…

阅读更多 →
面向对象编程(OOP)核心思想与实战技巧 2026/9/11 22:40:11

面向对象编程(OOP)核心思想与实战技巧

1. 面向对象编程的本质与核心思想我第一次接触面向对象编程(OOP)是在大学二年级的Java课上,当时教授在黑板上画了一个圆,说"这是一个对象"。十年后的今天,当我带领团队开发大型企业系统时,才真正理解那个简单的圆背后蕴…

阅读更多 →
TransUnet多分类语义分割实战:架构解析与关键改动 2026/9/11 22:40:11

TransUnet多分类语义分割实战:架构解析与关键改动

简介:面向计算机视觉与深度学习从业者,此压缩包提供了TransUnet多分类的完整工程实现,覆盖从数据处理、模型搭建到训练评估的整个流程。包内共30个文件,包含14个Python源码及对应pyc编译文件,可借此快速理解目录结构与…

阅读更多 →
在 Refine v5 中集成 Kinde 登录:从 KindeProvider 到 authProvider 的完整实战 2026/9/11 22:37:10

在 Refine v5 中集成 Kinde 登录:从 KindeProvider 到 authProvider 的完整实战

在 Refine v5 中集成 Kinde 登录:从 KindeProvider 到 authProvider 的完整实战 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞