На самом деле у меня есть экран, что корень - это ScrollableView, но когда пользователь входит в первый раз, я должен показать «всплывающую подсказку». Проблема в том, что я должен показать изображение, «привязанное» к нижней части представления с градиентом на фоне.
Итак, вот в чем проблема. Мне нужно знать, где разместить это представление, потому что оно будет зависеть от размера экрана.
Чтобы добиться этого, я считаю, что:
xml файл
<ScrollView>
<ConstraintLayout>
....
<FrameLayout
android:id = "@+id/first_open_tooltip"
android:layout_width = "0dp"
android:layout_height = "0dp"
android:background = "@drawable/gradient_white_transp"
app:layout_constraintEnd_toEndOf = "parent"
app:layout_constraintStart_toStartOf = "parent"
app:layout_constraintTop_toTopOf = "parent">
<android.support.constraint.ConstraintLayout
android:layout_width = "match_parent"
android:layout_height = "match_parent">
<ImageView
android:id = "@+id/mini_marker"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_marginEnd = "100dp"
android:layout_marginBottom = "16dp"
android:src = "@drawable/ic_bg_tooltip_marker"
app:layout_constraintBottom_toBottomOf = "parent"
app:layout_constraintEnd_toEndOf = "parent" />
<ImageView
android:id = "@+id/discover_new_tooltip"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:src = "@drawable/bg_tooltip"
app:layout_constraintBottom_toTopOf = "@id/mini_marker"
app:layout_constraintEnd_toEndOf = "parent"
app:layout_constraintStart_toStartOf = "parent" />
<TextView
android:layout_width = "224dp"
android:layout_height = "wrap_content"
android:layout_marginBottom = "32dp"
android:fontFamily = "@font/montserrat_bold"
android:gravity = "center_horizontal"
android:maxLines = "2"
android:text = "@string/firstopen_tooltip"
android:textColor = "#ffffff"
android:textSize = "18sp"
app:layout_constraintBottom_toBottomOf = "@id/tooltip"
app:layout_constraintEnd_toEndOf = "@id/tooltip"
app:layout_constraintStart_toStartOf = "@id/tooltip" />
</android.support.constraint.ConstraintLayout>
</FrameLayout>
</ConstraintLayout>
</ScrollView>
При этом во фрагменте я проверяю, впервые ли пользователь.
Если это так, я меняю LayoutParams FrameLayout, чтобы он поместился на экране:
val display = activity!!.windowManager.defaultDisplay
val size = Point()
display.getSize(size)
val height = size.y
var lp = discover_first_open_tooltip.layoutParams
lp.height = height //<--problem
first_open_tooltip.layoutParams = lp
Проблема
Вот где у меня проблема, потому что я получаю полную высоту экрана, а затем всплывающая подсказка скрывается, потому что внизу.
Есть ли способ просто получить «Видимую область» (на изображении)?
Есть ли способ узнать размер этих просмотров? Или обычно одинакового размера, например ... 48dp? потому что, если я не ошибаюсь, мне нужно преобразовать в dp -> px, чтобы установить параметры макета, нет?
Вам не нужно угадывать размер (в большинстве случаев 48dp) этих представлений. Просто выполните вычисления, на которые я указал, во время выполнения. И да, они вам понадобятся в PX.
С вашего эскиза похоже, что всплывающая подсказка расположена не на плоскости прокрутки, а в верхней части нижней панели действий. Поэтому я предлагаю такой макет:
<ScrollView>
<ConstraintLayout>
....
</ConstraintLayout>
</ScrollView>
<ConstraintLayout
android:layout_width = "match_parent"
android:layout_height = "match_parent">
<PutYourToolTipHere
android:layout_width = "match_parent"
android:layout_height = "match_parent"/>
<YourMenuBar
android:layout_width = "wrap_content"
android:layout_height = "wrap_content" />
</ConstraintLayout>
Смысл этого в том, чтобы наложить всплывающую подсказку, а не отображать ее в режиме прокрутки.
Вы пробовали
DisplayMetrics, а затем вычитали высоту строки состояния, панели навигации и высоты ваших нижних навигационных окон?