#java #android #android-view #android-canvas
Вопрос:
Я ценю, что название написано не очень хорошо, но немного сложно кратко объяснить мою проблему…
Я создаю приложение для 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>
если я удалю представление карты, чтобы в качестве родителя было только ограничение, это сработает. Если я увеличу изображение карты в направлении Y, это позволит выделить достаточно места для отображения всплывающего окна на дополнительном пространстве карты. Но в таком виде это не работает.
Это похоже на то, что это позволяет вам только один раз построить иерархию на родительском представлении, но не снова на представлении бабушки и дедушки.
Как я могу позволить ему рисовать поверх всех родительских представлений, чтобы это было похоже на настоящее «всплывающее окно»?
Надеюсь, в этом есть смысл
Ответ №1:
Простой ответ: вы не можете рисовать за пределами представления.
<RelativeLayout>
<RelativeLayout
android:width="400dp"
android:height="400dp">
<LineChartView
android:width="100dp"
android:height="100dp"/>
<RelativeLayout>
</RelativeLayout>
В приведенном выше случае, если вы проверите Canvas
размер в LineChartView
s onDraw(canvas)
, вы обнаружите, что высота и ширина равны 100dp. И это размер вашего представления. Таким образом, вы можете рисовать только в этом пространстве. Родительский элемент вашего представления на самом деле не оказывает никакого влияния, если вы не зададите ширину/высоту представления в качестве динамического значения, такого как MatchParent или wrapContent. Если вы сделаете сопоставление прозрачным в своем представлении, то ширина/высота холста станет 400dp.
По сути, размер холста определяет, какое пространство доступно для рисования и что видно на экране. Чтобы решить ваш вариант использования, вы можете заставить себя LineChartView
заполнить весь экран. Но при таком подходе вам придется отслеживать, где рисовать фактический график. Если экран прокручивается, то это добавит больше сложности.
Другой подход, который я считаю самым простым, состоит в том, чтобы иметь два представления (одно для линейной диаграммы, а другое для всплывающего окна). В представлении LineChart будет нарисован фактический график, а всплывающее окно будет охватывать весь экран. Когда пользователь выбирает что-то на графике, вам просто нужно передать значения графика вместе с абсолютным положением, в котором нужно нарисовать всплывающее окно, в всплывающее окно. Таким образом, вы можете нарисовать всплывающее окно в любом месте экрана.
Комментарии:
1. Спасибо! нарисовать представление в виде 2 отдельных представлений-хорошая идея, я думаю, что воспользуюсь этим подходом