我们怎样才能让标记视图显示在所有可能在其下呈现的图表前面?

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 ofMarkerView` 将 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

我尝试了以下方法,但没有成功:

深入研究 ChartMarkerView 的源代码后,我发现标记总是绘制到 Chart canvas,因此叠加饼图如下这样来实现双甜甜圈总是会遇到标记问题。

这可以通过子类来完成,并复制一些标记渲染源来改变渲染位置。由于这可能非常脆弱,并且仍然可能无法完全按预期工作,因此我选择捕获 OnChartValueSelected 事件并将所选数据呈现到图表之外的视图。