Получите "полезную" область экрана в Android

На самом деле у меня есть экран, что корень - это ScrollableView, но когда пользователь входит в первый раз, я должен показать «всплывающую подсказку». Проблема в том, что я должен показать изображение, «привязанное» к нижней части представления с градиентом на фоне.

Итак, вот в чем проблема. Мне нужно знать, где разместить это представление, потому что оно будет зависеть от размера экрана.

Получите "полезную" область экрана в Android

Чтобы добиться этого, я считаю, что:

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

Проблема

Вот где у меня проблема, потому что я получаю полную высоту экрана, а затем всплывающая подсказка скрывается, потому что внизу.

Есть ли способ просто получить «Видимую область» (на изображении)?

Вы пробовали DisplayMetrics, а затем вычитали высоту строки состояния, панели навигации и высоты ваших нижних навигационных окон?

shkschneider 02.01.2019 11:44

Есть ли способ узнать размер этих просмотров? Или обычно одинакового размера, например ... 48dp? потому что, если я не ошибаюсь, мне нужно преобразовать в dp -> px, чтобы установить параметры макета, нет?

Shudy 02.01.2019 11:50

Вам не нужно угадывать размер (в большинстве случаев 48dp) этих представлений. Просто выполните вычисления, на которые я указал, во время выполнения. И да, они вам понадобятся в PX.

shkschneider 02.01.2019 12:36
0
3
191
1

Ответы 1

С вашего эскиза похоже, что всплывающая подсказка расположена не на плоскости прокрутки, а в верхней части нижней панели действий. Поэтому я предлагаю такой макет:

<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>

Смысл этого в том, чтобы наложить всплывающую подсказку, а не отображать ее в режиме прокрутки.

Другие вопросы по теме