Я работаю над приложением JetPack Compose, где я хочу, чтобы текстовый элемент в Lazycolumn стал прозрачным, когда оно прокручивается под полупрозрачным Topappbar. Чтобы достичь этого, я использую Ongloballyposition, чтобы получить Y-координату и запустить анимацию, когда он приближается к Topappbar. В результате анимация начинается слишком поздно - когда текст полностью под топапбаром вместо того, когда его верхнее преимущество касается Topappbar. Мой каркас использует StatusBarsPadding () для обработки системных вставки, но это не влияет на систему координат.class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
ExampleTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
Demo(Modifier.padding(innerPadding))
}
}
}
}
}
< /code>
@Composable
internal fun Demo(modifier: Modifier = Modifier) {
val density = LocalDensity.current
val topBarHeightPx = with(density) { 60.dp.toPx() }
var wineTitleOffset by remember { mutableStateOf(Offset.Zero) }
val nameFraction = ((topBarHeightPx - wineTitleOffset.y) / topBarHeightPx * 2).coerceIn(0f, 1f)
val textColor = lerp(0f, 1f, nameFraction)
Scaffold(
modifier = modifier,
contentWindowInsets = WindowInsets.systemBars,
topBar = {...}
) {
LazyColumn{
item { Spacer(modifier = Modifier.height(60.dp)) }
items(10) {
Text(text = "Hello, Peter")
}
item {
Layout(
content = {
Text(
"EXAMPLE TEXT",
fontWeight = FontWeight.Bold,
fontSize = 20.sp,
modifier = Modifier
.layoutId(WineName)
.wrapContentHeight(align = Alignment.CenterVertically)
// COUNTING THE COORDINATES:
.onGloballyPositioned { coordinates ->
val windowPos = coordinates.positionInWindow()
val rootPos = coordinates.positionInRoot()
Log.d("Position", "Window: $windowPos | Root: $rootPos")
val pos = coordinates.positionInRoot()
wineTitleOffset = Offset(pos.x, pos.y)
}
,
textAlign = TextAlign.Center,
color = Color.Black.copy(alpha = textColor)
)
}...
< /code>
example of output:
Window: Offset(0.0, 196.0) | Root: Offset(0.0, 196.0)
< /code>
Sorry, I cannot add a picture as I do not have enough reputation
Подробнее здесь: https://stackoverflow.com/questions/796 ... le-element
Как получить координату композиционного элемента? ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1753020827
Anonymous
Я работаю над приложением JetPack Compose, где я хочу, чтобы текстовый элемент в Lazycolumn стал прозрачным, когда оно прокручивается под полупрозрачным Topappbar. Чтобы достичь этого, я использую Ongloballyposition, чтобы получить Y-координату и запустить анимацию, когда он приближается к Topappbar. В результате анимация начинается слишком поздно - когда текст полностью под топапбаром вместо того, когда его верхнее преимущество касается Topappbar. Мой каркас использует StatusBarsPadding () для обработки системных вставки, но это не влияет на систему координат.class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
ExampleTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
Demo(Modifier.padding(innerPadding))
}
}
}
}
}
< /code>
@Composable
internal fun Demo(modifier: Modifier = Modifier) {
val density = LocalDensity.current
val topBarHeightPx = with(density) { 60.dp.toPx() }
var wineTitleOffset by remember { mutableStateOf(Offset.Zero) }
val nameFraction = ((topBarHeightPx - wineTitleOffset.y) / topBarHeightPx * 2).coerceIn(0f, 1f)
val textColor = lerp(0f, 1f, nameFraction)
Scaffold(
modifier = modifier,
contentWindowInsets = WindowInsets.systemBars,
topBar = {...}
) {
LazyColumn{
item { Spacer(modifier = Modifier.height(60.dp)) }
items(10) {
Text(text = "Hello, Peter")
}
item {
Layout(
content = {
Text(
"EXAMPLE TEXT",
fontWeight = FontWeight.Bold,
fontSize = 20.sp,
modifier = Modifier
.layoutId(WineName)
.wrapContentHeight(align = Alignment.CenterVertically)
// COUNTING THE COORDINATES:
.onGloballyPositioned { coordinates ->
val windowPos = coordinates.positionInWindow()
val rootPos = coordinates.positionInRoot()
Log.d("Position", "Window: $windowPos | Root: $rootPos")
val pos = coordinates.positionInRoot()
wineTitleOffset = Offset(pos.x, pos.y)
}
,
textAlign = TextAlign.Center,
color = Color.Black.copy(alpha = textColor)
)
}...
< /code>
example of output:
Window: Offset(0.0, 196.0) | Root: Offset(0.0, 196.0)
< /code>
Sorry, I cannot add a picture as I do not have enough reputation
Подробнее здесь: [url]https://stackoverflow.com/questions/79666823/how-to-get-the-coordinate-of-composable-element[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия