在视图边界外绘制,在多个父视图组上



我知道标题写得不是很好,但要简洁地解释我的问题有点困难…

我正在创建一个Android应用程序,我有一个自定义的图表视图,它有一个小弹出窗口,它应该能够在图表视图本身的边界之外,并将根据你在折线图上选择的位置定位自己

当我在层次结构中有超过1个父视图组时,我很难让这个工作。这是我的布局xml:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:clipToPadding="false">
<androidx.cardview.widget.CardView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:clipChildren="false"
android:clipToPadding="false"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.myapp.ui.views.chart.line.LineChartView
android:id="@+id/lineChartView"
android:layout_width="match_parent"
android:layout_height="228dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>

如果我移除CardView所以只有ConstraintLayout作为父元素,它能工作。如果我让CardView在Y方向上变大它就有足够的空间在额外的卡空间上画出弹出框。但就像这样,它不起作用。

这有点像它只允许你在父视图上绘制一次层次结构而不能在祖父视图上再次绘制。

我如何允许它在任何和所有父视图的顶部绘制,使其像一个真正的"弹出窗口"?

希望这是有意义的

简单的回答:你不能画出视图的边界。

<RelativeLayout>
<RelativeLayout
android:width="400dp"
android:height="400dp">

<LineChartView
android:width="100dp"
android:height="100dp"/>
<RelativeLayout>
</RelativeLayout>

在上面的例子中,如果你在LineChartViewonDraw(canvas)中检查Canvas的尺寸,你会发现高度和宽度是100dp。这是视图的大小。所以你只能在这个范围内画画。视图的父类并没有真正的影响,除非你将视图的宽度/高度设置为像MatchParent或WrapContent这样的动态值。如果你在视图上做了MatchParent,那么画布的宽度/高度就变成了400dp。

本质上,Canvas的大小决定了可以绘制的空间和屏幕上可见的内容。为了解决您的用例,您可以让LineChartView填充整个屏幕。但是使用这种方法,您将不得不跟踪绘制实际图形的位置。如果屏幕是可滚动的,那么它将增加更多的复杂性。

另一种方法,我认为是简单的一个,是有两个视图(一个用于LineChart,另一个用于PopUp)。LineChartView将绘制实际的图形,而PopUp视图将覆盖整个屏幕。当用户在图形中选择某些东西时,你只需要将图形的值与绘制popUp的绝对位置一起传递给PopUpView。这样你就可以在屏幕上的任何地方绘制弹出窗口。

最新更新