AdjustPan расчет - PullRequest
       8

AdjustPan расчет

0 голосов
/ 01 апреля 2019

У меня есть вид сверху экрана, который я хочу, чтобы он всегда отображался (на каждом устройстве, даже если клавиатура открыта).Проблема в том, что в середине экрана у меня есть EditText.В некоторых устройствах, если EditText получает фокус, клавиатура открывается и заставляет раскладку двигаться вверх.Я не хочу использовать AdjustResize, который заставит фоновое изображение растягиваться.Можно ли узнать, была ли перемещена раскладка из-за открытой клавиатуры?Кроме того, как рассчитывается это движение вверх?Я думаю о перестановке вида всякий раз, когда это необходимо

- Первая попытка решить проблему: я пробовал расположение координаторов.Я не нашел поведения, чтобы делать то, что я хочу, поэтому я попытался реализовать свое собственное поведение.Я добавил пространство внизу макета и всякий раз, когда этот вид менял свою позицию, я пытался перевести вниз вид сверху.Но даже если layoutDependsOn () возвращает true, onDependentViewChanged () не вызывается для вычисления перевода.

- Вторая попытка решить проблему: я снова добавил пробел в нижней части макета.Кроме того, я добавил onGlobalLayoutListener, чтобы отслеживать, была ли клавиатура открыта.Если это так, я попытался вычислить положение космического вида и сравнить его с предыдущим положением, чтобы переместить вниз вид сверху.

- Третья попытка состояла в том, чтобы использовать AdjustNothing и самостоятельно передать переводы нужных видов.переместить себя на открытой клавиатуре.Это была единственная попытка, которая дала мне некоторые результаты, но кажется ошибочной, и в будущем я уверен, что это вызовет гораздо больше проблем, чем решит.

Кроме того, я обнаружил, что x, y, translationX, translationYне меняйте в AdjustPan.Единственный способ вычислить правильную позицию - использовать getLocationOnScreen ().Но это возможно после того, как вид был выложен.Можем ли мы рассчитать это до того, как представление будет выложено?

1 Ответ

0 голосов
/ 05 апреля 2019

Для дальнейшего использования, чтобы рассчитать пиксели восходящего перевода в режиме AdjustPan, вы должны сделать что-то вроде следующего кода. По сути, в AdjustPan мы нажимаем столько раз, сколько необходимо для макета, чтобы сделать полностью сфокусированный EditText видимым.

val rect = Rect()
constraintLayout.getWindowVisibleDisplayFrame(rect)
val editTextGlobalRect = Rect()
view.getGlobalVisibleRect(editTextGlobalRect)

//if it is true the editText will be hidden so the layout will be moved upwards due to adjust pan
val translation = if (editTextGlobalRect.bottom > visibleArea.bottom) {
    //Calculate how much the layout is going to be pushed
    editTextGlobalRect.bottom - visibleArea.bottom.toFloat()
} else {
    0f
}

Кроме того, если вы хотите вычислить новую позицию вида, чтобы придерживаться той же позиции на экране, вы должны сделать что-то подобное:

val stationaryViewGlobalRect = Rect()
stationaryView.getGlobalVisibleRect(stationaryViewGlobalRect)

stationaryView.y = when {
    translation <= stationaryViewGlobalRect.top -> {
        //Stationary view is not hidden at all but it was moved upwards
        stationaryViewGlobalRect.top - translation + resources.getDimension(R.dimen.stationary_view_margin_top)
    }
    translation <= stationaryViewGlobalRect.bottom -> {
        //Stationary view is not fully hidden
        translation + (stationaryViewGlobalRect.bottom - translation)
    }
    else -> translation + stationaryViewGlobalRect.top //Stationary view is fully hidden
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...