我有一个用Charts library实现的饼图。现在,当点击一个条目并将其突出显示时,我想显示一个工具提示,该提示显示所选条目的值,该值位于该条目的中间,并以与所选饼图相同的颜色勾勒出轮廓。>
在委托函数chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight)
中,我可以获得突出显示的xPx
和yPx
,但这是用户点击以突出显示该条目的接触点,而不是突出显示的中心点。条目本身,因此将工具提示置于这些值的中心会导致工具提示根据您点击条目的位置而跳来跳去。而且我看不到任何获得突出显示条目颜色的方法。
答案 0 :(得分:1)
::: 1 ::弹出窗口的位置
嗯...我一直在寻找,但我认为ChartDataEntry
没有可用的frame
用作设置弹出窗口位置的参考点。
不过,我认为根据拍子位置进行操作是一种不错的选择。这至少会使弹出窗口显示在与饼图段相同的常规区域中。我认为,它仍然应该是一种良好的用户体验。 :)
::: 2 ::当前所选细分的颜色
PieChartDataSet
具有一个values
属性,其中包含您的ChartDataEntry
对象。因此,由于chartValueSelected
委托方法向您传递了当前的ChartDataEntry
对象(entry
),因此您可以找到匹配索引的索引。
答案 1 :(得分:0)
PieChartView
具有marker
属性,当您在图表上单击某个值时,可以将其用作显示标记。我认为,使用marker
属性并创建自定义标记类是解决任务的首选方法。
自定义标记类必须符合IMarker
协议,并且可以从MarkerImage
类实例化。注意两个功能:
draw(context: CGContext, point: CGPoint)
函数带有两个输入参数,这些参数传递用于绘制的位置和上下文。因此,您可以获得有关气球位置的信息。
refreshContent(entry: ChartDataEntry, highlight: Highlight)
。在此功能中,您可以为气球选择颜色。 MarkerImage
类具有chartView
属性,因此您可以访问数据集。如果使用多个数据集,则可以使用值highlight.dataSetIndex
来定义被单击的数据集。选择数据集后,您可以使用dataSet.colors
获得的索引从dataSet.entryIndex(entry: entry)
属性中获取颜色。
颜色选择示例:
open override func refreshContent(entry: ChartDataEntry, highlight: Highlight)
{
let dataSet = chartView!.data!.dataSets[highlight.dataSetIndex]
let colorIndex = dataSet.entryIndex(entry: entry) % dataSet.colors.count
color = dataSet.colors[colorIndex]
super.refreshContent(entry: entry, highlight: highlight)
}