我们怎样才能让标记视图显示在所有可能在其下呈现的图表前面?
How can we get marker views to show up in front of ALL charts that may be rendered under it?
如果您有两个重叠的图表,则后面的图表会在更前景的图表下方呈现其 MarkerView。有什么办法可以防止这种情况发生吗?
我按照以下过程使用 MPAndroid 图表创建了一个 "double donut" 图表(外部圆环饼图,内部饼图)。
创建一个包含 2 个饼图的布局,以 parent 视图为中心:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.github.mikephil.charting.charts.PieChart
android:id="@+id/outer_chart"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true" />
<com.github.mikephil.charting.charts.PieChart
android:id="@+id/inner_chart"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true" />
</RelativeLayout>
我正在调整图表的大小:
val innerChartHeight = (chartHeight * 0.85f).toInt()
val outerLayout = outerChart.layoutParams as RelativeLayout.LayoutParams
outerLayout.height = chartHeight
outerLayout.setMargins(baseChartMargin)
outerChart.layoutParams = outerLayout
val innerLayout = innerChart.layoutParams as RelativeLayout.LayoutParams
innerLayout.height = innerChartHeight
innerLayout.setMargins(baseChartMargin)
innerChart.layoutParams = innerLayout
我将外图表半径设置为 90%,以反式parent 为中心,并禁用图例,以便图表的图表部分保持对齐:
outerChart.holeRadius = 90f
outerChart.setTransparentCircleColor(Color.TRANSPARENT)
outerChart.setTransparentCircleAlpha(0)
outerChart.transparentCircleRadius = 90f
innerChart.legend.isEnabled = false
outerChart.legend.isEnabled = false
我像下面这样设置标记视图。 LabelValueMarkerView' is just a simple extension of
MarkerView` 将 Label 呈现为 header 并使用特定布局资源呈现下方的 Value:
val outerMarker = LabelValueMarkerView(
context = requireContext(),
labelFormatter = IndexedLabelFormatter(outerPieEntries.map { e -> e.label }),
valueFormatter = RxPieValueFormatter(0))
outerMarker.chartView = outerChart
outerChart.marker = outerMarker
val innerMarker = LabelValueMarkerView(
context = requireContext(),
labelFormatter = IndexedLabelFormatter(innerPieEntries.map { e -> e.label }),
valueFormatter = RxPieValueFormatter(0))
innerMarker.chartView = innerChart
innerChart.marker = innerMarker
我尝试了以下方法,但没有成功:
- 在标记添加到图表时以编程方式设置标记的高度。这没有任何效果。
- 在布局中的内部图表之后对外部图表进行排序,以便它的标记将呈现在内部图表上。这适用于外部标记,但由于外部图表捕获事件,您无法点击内部图表。另外,如果内部图表标记在外部图表下方偏移,我们无论如何都会遇到同样的问题。
深入研究 Chart
和 MarkerView
的源代码后,我发现标记总是绘制到 Chart
canvas,因此叠加饼图如下这样来实现双甜甜圈总是会遇到标记问题。
这可以通过子类来完成,并复制一些标记渲染源来改变渲染位置。由于这可能非常脆弱,并且仍然可能无法完全按预期工作,因此我选择捕获 OnChartValueSelected
事件并将所选数据呈现到图表之外的视图。
如果您有两个重叠的图表,则后面的图表会在更前景的图表下方呈现其 MarkerView。有什么办法可以防止这种情况发生吗?
我按照以下过程使用 MPAndroid 图表创建了一个 "double donut" 图表(外部圆环饼图,内部饼图)。
创建一个包含 2 个饼图的布局,以 parent 视图为中心:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.github.mikephil.charting.charts.PieChart
android:id="@+id/outer_chart"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true" />
<com.github.mikephil.charting.charts.PieChart
android:id="@+id/inner_chart"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true" />
</RelativeLayout>
我正在调整图表的大小:
val innerChartHeight = (chartHeight * 0.85f).toInt()
val outerLayout = outerChart.layoutParams as RelativeLayout.LayoutParams
outerLayout.height = chartHeight
outerLayout.setMargins(baseChartMargin)
outerChart.layoutParams = outerLayout
val innerLayout = innerChart.layoutParams as RelativeLayout.LayoutParams
innerLayout.height = innerChartHeight
innerLayout.setMargins(baseChartMargin)
innerChart.layoutParams = innerLayout
我将外图表半径设置为 90%,以反式parent 为中心,并禁用图例,以便图表的图表部分保持对齐:
outerChart.holeRadius = 90f
outerChart.setTransparentCircleColor(Color.TRANSPARENT)
outerChart.setTransparentCircleAlpha(0)
outerChart.transparentCircleRadius = 90f
innerChart.legend.isEnabled = false
outerChart.legend.isEnabled = false
我像下面这样设置标记视图。 LabelValueMarkerView' is just a simple extension of
MarkerView` 将 Label 呈现为 header 并使用特定布局资源呈现下方的 Value:
val outerMarker = LabelValueMarkerView(
context = requireContext(),
labelFormatter = IndexedLabelFormatter(outerPieEntries.map { e -> e.label }),
valueFormatter = RxPieValueFormatter(0))
outerMarker.chartView = outerChart
outerChart.marker = outerMarker
val innerMarker = LabelValueMarkerView(
context = requireContext(),
labelFormatter = IndexedLabelFormatter(innerPieEntries.map { e -> e.label }),
valueFormatter = RxPieValueFormatter(0))
innerMarker.chartView = innerChart
innerChart.marker = innerMarker
我尝试了以下方法,但没有成功:
- 在标记添加到图表时以编程方式设置标记的高度。这没有任何效果。
- 在布局中的内部图表之后对外部图表进行排序,以便它的标记将呈现在内部图表上。这适用于外部标记,但由于外部图表捕获事件,您无法点击内部图表。另外,如果内部图表标记在外部图表下方偏移,我们无论如何都会遇到同样的问题。
深入研究 Chart
和 MarkerView
的源代码后,我发现标记总是绘制到 Chart
canvas,因此叠加饼图如下这样来实现双甜甜圈总是会遇到标记问题。
这可以通过子类来完成,并复制一些标记渲染源来改变渲染位置。由于这可能非常脆弱,并且仍然可能无法完全按预期工作,因此我选择捕获 OnChartValueSelected
事件并将所选数据呈现到图表之外的视图。