Compose 组件 BoxWithConstraints 的理解

452 阅读1分钟
BoxWithConstraints 可以提供给子组件父节点传递的约束

BoxWithConstraints(
    modifier = Modifier.fillMaxWidth()
) {
    // todo 在这里可以拿到 constraints 就是父节点传递的约束
    val anim = remember {
        Animatable(0f)
    }
    // 简单实现的大图移动
    LaunchedEffect(key1 = Unit, block = {
        anim.animateTo(1f, animationSpec = infiniteRepeatable(tween(5000), repeatMode = RepeatMode.Reverse))
    })
    val context = LocalContext.current
    val image = remember {
        ImageBitmap.imageResource(context.resources,R.mipmap.big_anim_bg)
    }
    val totalOffset = if(image.height - constraints.maxHeight > 0) image.height - constraints.maxHeight else 0
    val srcWidth = if(constraints.maxWidth > image.width) image.width else constraints.maxWidth
    val srcHeight = if(constraints.maxHeight > image.height) image.height else constraints.maxHeight
    Image(painter = BitmapPainter(image = image,
        srcSize = IntSize(srcWidth,srcHeight),
        srcOffset = IntOffset(0, (totalOffset * anim.value).toInt())
    ),
        contentDescription = "",
        contentScale = ContentScale.FillBounds,
        modifier = Modifier.fillMaxWidth()
    )
}