Browse Source

chatgui-android: автоскролл чата вниз при открытии клавиатуры и своих сообщениях

v2
evgeny 3 weeks ago
parent
commit
369b253bdb
  1. 17
      tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/ChatScreen.kt

17
tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/ChatScreen.kt

@ -18,6 +18,7 @@ import androidx.compose.material3.*
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import com.utun.chat.data.Channel import com.utun.chat.data.Channel
@ -122,13 +123,23 @@ fun ChatScreen(
initialScrolled = true initialScrolled = true
return@LaunchedEffect return@LaunchedEffect
} }
/* новое сообщение: анимируем только если пользователь у нижнего края */ /* новое сообщение: скроллим вниз если своё, либо если были у нижнего края */
val lastVisible = listState.layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: -1 val ownMessage = messages.lastOrNull()?.isOutgoing == true
if (lastIndex - lastVisible <= 1) { val wasAtBottom = !listState.canScrollForward
if (ownMessage || wasAtBottom) {
listState.animateScrollToItem(lastIndex) listState.animateScrollToItem(lastIndex)
} }
} }
/* при открытии клавиатуры прижимаем список к низу, чтобы последнее сообщение осталось видимым */
val density = LocalDensity.current
val imeVisible = WindowInsets.ime.getBottom(density) > 0
LaunchedEffect(imeVisible) {
if (imeVisible && messages.isNotEmpty()) {
listState.scrollToItem(messages.size - 1)
}
}
Column( Column(
modifier = Modifier.fillMaxSize().imePadding() modifier = Modifier.fillMaxSize().imePadding()
) { ) {

Loading…
Cancel
Save