【一起来学习鸿蒙开发】HarmonyOS运动健康类行业实践 - 健身记录三环效果
·
想系统学习HarmonyOS开发?
加入班级,这里有成体系的学习资源,一站式成长通道已为你打开!
场景介绍
阅读时长看板是新闻阅读类应用中的典型场景之一,如用户需要查看不同周期内的阅读时长。
本示例基于CanvasRenderingContext2D绘制阅读时长统计直方图,通过@Watch装饰器刷新图表实现周、月、年等视图切换。
效果预览
实现思路
- 通过按钮(周、月、年、总)切换不同时间维度的视图,在周、月、年视图内点击左右翻页键可选择具体时间。
- // ReadingStatsPage.ets
- Row() {
- if (this.currentView !== this.viewMap.get('all')) {
- Image($r('app.media.ic_left_one'))
- .onClick(() => {
- if (this.currentView === this.viewMap.get('week')) {
- this.weekOffset--;
- this.curWeekData = getReadingDataStatic(this.getCurrentWeekData())
- } else if (this.currentView === this.viewMap.get('month')) {...
- } else if (this.currentView === this.viewMap.get('year')) {...
- } else {...
- }
- })
- } else {...
- }
- }
- Column() { // 统计卡片,根据当前视图显示不同的图表
- Column() {
- if (this.currentView === this.viewMap.get('week') || this.currentView === this.viewMap.get('day')) {
- BarChart({label: 'week', xAxisData: weekAxis, curData: this.curWeekData});
- } else if (this.currentView === this.viewMap.get('month')) {...
- } else if (this.currentView === this.viewMap.get('year')) {...
- } else if (this.currentView === this.viewMap.get('all')) {...
- }
- }
- }
- 点击左右翻页键后,通过@Watch装饰器通知数据变更,更新阅读数据,重新生成直方图。
- // Chart.ets
- @Prop @Watch('onDataChange') curData: ReadingDataStatic = new ReadingDataStatic() // 当前的阅读数据
- onDataChange() {
- this.curDataHour = this.curData.dailyMinutes.map(item => Math.floor(item / this.threshold));
- this.defOption = this.createOption()
- }
- 通过CanvasRenderingContext2D绘制直方图,绘制过程中根据需要计算边距、单元间隔,并按比例换算直方的y轴数值,依次绘制分隔线、坐标轴、直方图。
- // HistogramChart.ets
- aboutToAppear() {
- this.applyOptions()
- }
- onDataChange() { // 使用更新后的配置绘制图形
- this.applyOptions()
- this.drawChart();
- }
- private drawChart() { // 绘制图表
- CTX.clearRect(0, 0, width, height) // 清空画布
- const CHART_AREA: chartArea = {...}; // 计算实际绘图区域(考虑所有边距),先绘制网格线,绘制完网格线后调整比例尺
- if (this.config.gridLineStyle.show) { // 绘制网格线
- yScale = this.drawGridLines(CTX, chartArea.x, chartArea.y, chartArea.width, chartArea.height, maxDataValue, yScale);
- }
- this.drawYAxis(CTX, chartArea.x, chartArea.y, chartArea.width, chartArea.height, maxDataValue, yScale); // 绘制Y轴
- this.drawXAxis(CTX, chartArea.x, chartArea.y, chartArea.width, chartArea.height); // 绘制X轴
- this.drawBars(CTX, chartArea.x, chartArea.y, chartArea.width, chartArea.height, yScale); // 绘制柱状图
- }
约束与限制
- 本示例支持API Version 17 Release及以上版本。
- 本示例支持HarmonyOS 5.0.5 Release SDK及以上版本。
- 本示例需要使用DevEco Studio 5.0.5 Release及以上版本进行编译运行。
工程目录
- ├──entry/src/main/ets // 代码区
- │ ├──component
- │ │ ├──Chart.ets // 阅读数据、直方图绘制
- │ │ └──HistogramChart.ets // 直方图组件
- │ ├──entryability
- │ │ └──EntryAbility.ets // 程序入口
- │ ├──entrybackupability
- │ │ └──EntryBackupAbility.ets
- │ ├──model
- │ │ ├──DailyReadingData.ets // 阅读相关接口、类定义
- │ │ ├──MockData.ets // 阅读数据打桩
- │ │ └──PersonalReadingStats.ets // 商品实例定义
- │ └──pages
- │ └──ReadingStatsPage.ets // 主页面-阅读数据看板
- └──entry/src/main/resources // 应用资源目录
参考文档
代码下载
(文章转载至华为开发者联盟官网)
更多推荐


所有评论(0)