Как получить координату композиционного элемента?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как получить координату композиционного элемента?

Сообщение 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

Подробнее здесь: https://stackoverflow.com/questions/796 ... le-element
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»