galex
07/24/2020, 10:12 AMmolikto
07/24/2020, 10:14 AMgalex
07/24/2020, 10:14 AMFudge
07/24/2020, 11:13 AMinvalidate
which is supposed to recomposegalex
07/24/2020, 11:14 AMFudge
07/24/2020, 11:15 AMvar fullSize by state { false }
Box(Modifier.sizePercentage(animate(if(fullSize) 0 else 100)) {
RootComposable()
}
// And then somewhere
fullSize = true
Note sizePercentage
is not a real modifier, I don't know how it's called in Composegalex
07/24/2020, 11:26 AMFudge
07/24/2020, 11:26 AMDoris Liu
07/24/2020, 10:32 PMgalex
07/25/2020, 4:49 AMDoris Liu
07/25/2020, 4:54 AMgalex
07/25/2020, 4:55 AMDoris Liu
07/25/2020, 5:02 AMgalex
07/25/2020, 5:36 AMDoris Liu
07/25/2020, 5:55 AMclass MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Box(Modifier.fillMaxSize(), gravity = Alignment.Center) {
Stack {
Box(Modifier.clipToBounds().materialTransform(500, 500)) {
val scaffoldState = remember { ScaffoldState() }
Scaffold(
scaffoldState = scaffoldState,
drawerContent = { Text("Drawer content") },
topBar = {
TopAppBar(
title = { Text("Material Transform") },
navigationIcon = {
IconButton(onClick = {
}) {
Icon(<http://Icons.Filled.Menu|Icons.Filled.Menu>)
}
}
)
},
floatingActionButtonPosition = Scaffold.FabPosition.End,
bodyContent = { innerPadding ->
Text("Hello Material Transition")
}
)
}
FloatingActionButton(modifier = Modifier.gravity(Alignment.BottomEnd)
.padding(10.dp),
onClick = { /*do something*/ }) {
Icon(Icons.Filled.Favorite)
}
}
}
}
}
}
fun Modifier.materialTransform(startingWidth: Int, startingHeight: Int) = composed {
this + MaterialTransform(startingWidth, startingHeight, AnimationClockAmbient.current)
}
class MaterialTransform(
startingWidth: Int,
startingHeight: Int,
clock: AnimationClockObservable
) : LayoutModifier {
val width = AnimatedFloatModel(startingWidth.toFloat(), clock)
val height = AnimatedFloatModel(startingHeight.toFloat(), clock)
override fun MeasureScope.measure(
measurable: Measurable,
constraints: Constraints,
layoutDirection: LayoutDirection
): MeasureScope.MeasureResult {
val placeable = measurable.measure(constraints = constraints)
val targetWidth = placeable.width.toFloat()
val targetHeight = placeable.height.toFloat()
if (targetWidth != width.targetValue || targetHeight != height.targetValue) {
val anim = repeatable<Float>(
50,
TweenSpec(durationMillis = 1000),
repeatMode = RepeatMode.Reverse
)
width.animateTo(targetWidth, anim)
height.animateTo(targetHeight, anim)
}
return layout(width.value.roundToInt(), height.value.roundToInt()) {
placeable.place(0, 0)
}
}
}
galex
07/25/2020, 7:49 AM