自己写写Android上的Chart Engine(二. bar chart)

本文详细介绍了如何优化柱状图的显示效果,包括实现多分类颜色区分、添加交互式tooltip以及整合标题与图例。进一步,文章探讨了在已有图表基础上构建饼图的初步步骤。
From :
[url]http://blog.sina.com.cn/s/blog_83395bd50100ugsf.html[/url]

今天算是坚持了,对昨天完工的bar chart做了一定的polish:
1)能同时画出多个分类的bar,以不同的颜色显示;
2)添加了tooltip,不过这个tooltip需要用户点击(touch)响应的bar根据bar的数据、颜色和位置等信息显示该bar的信息(分类,横坐标,纵坐标);
3) 在bar chart和chart Grid的基础上又添加了Title和legend。

简单介绍几个组成部分:
首先显示的bar chart (包括bar,Grid,title和legend)包含在一个BarChart View(继承View)中,是静态的。而tool tip是动态的View,在用户点击bar时出发BarChart View的OnTouch事件。然后判断touch坐标位于哪个Bar当中,进而获取该bar的信息,并创建tool tip view显示出来。当然,当用户touch空白位置时,显示的tooltip见消失,touch另一个bar时,当前显示的tooltip也将消失,并在当前touch的bar上显示新的tooltip。

实例:
横坐标:
lCtStr[0] = "mon";
lCtStr[1] = "Tue";
lCtStr[2] = "Wes";
lCtStr[3] = "Thu" ;
纵坐标分为三类:
DataMeasure lDM = new DataMeasure(lVal, "Food", "$");
DataMeasure lDM2 = new DataMeasure(lVal2, "Cloth", "$");
DataMeasure lDM3 = new DataMeasure(lVal3, "Other", "$");

最终显示出的barchart如下图:

[img]http://s9.sinaimg.cn/middle/83395bd5ha6b2c6a90298&690[/img]

在用户touch横坐标为mon,纵坐标为cloth类别的bar时,显示了当前bar的信息(Cloth, mon, 120).

接下来开始着手pie chart的创建....
是什么代码,实现了哪些功能 // App entry for preview import SwiftUI @main struct LegbotsApp: App { @StateObject var engine = MetricsEngine() var body: some Scene { WindowGroup { TabView { HomeView() .tabItem { Label("Home", systemImage: "house.fill") } StepsStatsView() .tabItem { Label("Stats", systemImage: "chart.bar.xaxis") } ProfileView() .tabItem { Label("Profile", systemImage: "person.fill") } } .environmentObject(engine) .onAppear { // Simulate ticks Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { _ in engine.tick() } // Fake hour bins for demo engine.stepHourBins = (0..<24).map { HourBin(hour: $0, value: Double(Int.random(in: 0...600))) } engine.caloriesHourBins = (0..<24).map { HourBin(hour: $0, value: Double.random(in: 0...20)) } engine.assistHourBins = (0..<24).map { HourBin(hour: $0, value: Double.random(in: 10...60)) } } } } } struct ProfileView: View { @EnvironmentObject var engine: MetricsEngine var body: some View { VStack(alignment: .leading, spacing: 18) { Text("Profile").font(.title2).bold().foregroundColor(.textPrimary) VStack(spacing: 10) { row("Height", "\(String(format: "%.0f", engine.profile.heightM*100)) cm") row("Weight", "\(Int(engine.profile.weightKg)) kg") row("Age", "\(engine.profile.age)") row("Paired Device", "Leg Assist Model A") Button("UNPAIR") {} .font(.headline) .frame(maxWidth: .infinity) .padding() .background(RoundedRectangle(cornerRadius: 14).fill(Color.card)) .foregroundColor(.textPrimary) } Spacer() HStack { Image(systemName: "envelope.fill").foregroundColor(.teal) Text("Contact Us").foregroundColor(.textPrimary) Spacer() } .padding() .background(RoundedRectangle(cornerRadius: 14).fill(Color.card)) Spacer() } .padding() .background(Color.bgDeep.ignoresSafeArea()) } private func row(_ k: String, _ v: String) -> some View { HStack { Text(k).foregroundColor(.textSecondary); Spacer(); Text(v).foregroundColor(.textPrimary) } .padding() .background(RoundedRectangle(cornerRadius: 14).fill(Color.card)) } }
09-05
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值