AAChartKit 中动态控制折线图选中点的高亮显示
在数据可视化应用中,折线图是最常用的图表类型之一。AAChartKit 作为一款功能强大的 iOS 图表库,提供了丰富的交互功能。本文将详细介绍如何在 AAChartKit 中通过代码动态控制折线图选中点的高亮显示,而不依赖用户点击操作。
核心实现原理
AAChartKit 基于 Highcharts 引擎,其选中点的高亮显示实际上是通过触发图表元素的 mouseOver 事件来实现的。我们可以通过 JavaScript 直接调用相关方法,控制特定数据点的高亮状态。
基础实现方法
默认选中点设置
在图表加载完成后,可以通过 chart.events.load 回调函数设置默认选中的点:
AAOptions *aaOptions = aaChartModel.aa_toAAOptions;
aaOptions.chart.eventsSet(AAChartEvents.new
.loadSet([NSString stringWithFormat:@AAJSFunc(function() {
const points = [];
const chart = this;
const series = chart.series;
const length = series.length;
for (let i = 0; i < length; i++) {
const pointElement = series[i].data[%ld];
pointElement.onMouseOver();
points.push(pointElement);
}
chart.xAxis[0].drawCrosshair(null, points[0]);
chart.tooltip.refresh(points);
}), defaultSelectedIndex]));
这段代码会在图表加载完成后,自动高亮显示指定索引位置的数据点,并显示对应的十字准线和工具提示。
动态更新选中点
在实际应用中,我们可能需要根据业务逻辑动态切换高亮点。相比重新渲染整个图表,更高效的做法是直接调用 JavaScript 方法局部更新:
NSString *jsFunc = ([NSString stringWithFormat:@AAJSFunc(
function syncRefreshTooltip() {
const points = [];
const chart = aaGlobalChart;
const series = chart.series;
const length = series.length;
for (let i = 0; i < length; i++) {
const pointElement = series[i].data[%ld];
pointElement.onMouseOver();
points.push(pointElement);
}
chart.xAxis[0].drawCrosshair(null, points[0]);
chart.tooltip.refresh(points);
}
syncRefreshTooltip();
), targetIndex]);
[chartView aa_evaluateJavaScriptStringFunction:jsFunc];
这种方法只更新需要变化的部分,避免了整个图表的重新渲染,性能更优。
自动轮播高亮点
在某些场景下,我们可能需要实现自动轮播高亮不同数据点的效果。这可以通过定时器实现:
AAOptions *aaOptions = AAOptions.new
.chartSet(AAChart.new
.eventsSet(AAChartEvents.new
.loadSet(@AAJSFunc(function() {
const chart = this;
let currentIndex = 0;
let intervalId;
function moveTooltip() {
const pointsToShow = [];
for (let i = 0; i < chart.series.length; i++) {
const point = chart.series[i].points[currentIndex];
if (point) {
pointsToShow.push(point);
}
}
if (pointsToShow.length > 0) {
chart.tooltip.refresh(pointsToShow);
chart.xAxis[0].drawCrosshair(null, pointsToShow[0]);
currentIndex = (currentIndex + 1) % chart.series[0].points.length;
}
}
intervalId = setInterval(moveTooltip, 2000); // 每2秒切换一次
// 初始显示第一个点
moveTooltip();
// 图表销毁时清除定时器
this.callbacks.push(function() {
if (intervalId) {
clearInterval(intervalId);
}
});
}))));
这段代码实现了每2秒自动切换到下一个数据点的效果,同时考虑了图表销毁时的资源清理。
交互优化
在实际应用中,我们还需要考虑用户交互。当用户手动操作图表时,应该暂停自动轮播;用户操作结束后,再恢复自动轮播:
let isTouched = false;
// 触摸开始事件
chart.container.ontouchstart = function(e) {
isTouched = true;
if (intervalId) {
clearInterval(intervalId);
intervalId = null;
}
handleTouch(e);
};
// 触摸移动事件
chart.container.ontouchmove = function(e) {
if (isTouched) {
handleTouch(e);
}
};
// 触摸结束事件
chart.container.ontouchend = function() {
isTouched = false;
if (!intervalId) {
// 立即移动到下一个点,然后开始 interval
moveTooltip();
startInterval();
}
};
样式定制
高亮点的样式可以通过以下配置进行定制:
// 十字准线样式
aaOptions.xAxis.crosshairSet(AACrosshair.new
.colorSet(AAColor.darkGrayColor)
.dashStyleSet(AAChartLineDashStyleTypeLongDashDotDot)
.widthSet(@2));
// 工具提示样式
aaOptions.tooltip
.styleSet(AAStyleColor(AAColor.whiteColor))
.backgroundColorSet(@"#050505")
.borderColorSet(@"#050505");
总结
AAChartKit 提供了灵活的方式来实现折线图选中点的动态控制。通过 JavaScript 直接操作图表元素,我们可以实现:
- 设置默认高亮点
- 动态切换高亮点
- 自动轮播高亮点
- 与用户交互的良好配合
这些技术可以广泛应用于实时数据监控、数据演示等场景,为用户提供更直观的数据可视化体验。关键是要理解 Highcharts 的底层机制,通过适当的事件处理和 JavaScript 调用实现所需功能,同时注意性能优化和用户体验。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00
GLM-4.7-FlashGLM-4.7-Flash 是一款 30B-A3B MoE 模型。作为 30B 级别中的佼佼者,GLM-4.7-Flash 为追求性能与效率平衡的轻量化部署提供了全新选择。Jinja00
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin07
compass-metrics-modelMetrics model project for the OSS CompassPython00