![]() |
تحريك الأيقونات مثل المحترفين: دليل تفاعلي مع كود جاهز |
شرح animations في kotlin compose بكل سهوله
يقدم Kotlin Compose العديد من الميزات التي تجعله قويًا في عملية الرسوم المتحركة، بما في ذلك:التحكم السلس في الرسوم المتحركة , يوفر Jetpack Compose المرونة في إنشاء الرسوم المتحركة باستخدام واجهات برمجة التطبيقات البسيطة، مثل animateFloatAsState وanimateDpAsState. يمكنك التحكم بسهولة في حالة الرسوم المتحركة بناءً على الحالة الحالية لواجهة المستخدم.
دمج الرسوم المتحركة في مكونات واجهة المستخدم:
يسمح التركيب بدمج الرسوم المتحركة بسلاسة في أي مؤلف، مما يجعل من السهل التحكم في الرسوم المتحركة بناءً على حالة المكون، مثل جعل العناصر تظهر وتختفي، والتحكم في حجمها أو موقعها.التفاعل مع المستخدم:
يستخدم compose آليات قوية لإدارة الرسم والرسوم المتحركة لتوفير تجربة مستخدم سلسة، حتى في التطبيقات الكبيرة. ومن السهل تخصيص الرسوم المتحركة لتناسب احتياجات تطبيقك باستخدام Tween أو Spring أو Keyframes.
انميشن لتنفيذ عملية حذف للعناصر في كوتلن كومبوس
viewmodel.class
@HiltViewModel
class CounterViewModel : ViewModel() {
private val _state = MutableStateFlow(ItemUiState())
val state = _state.asStateFlow()
...
fun onClick(selectItem: ItemModel) {
_state.update {
it.copy(
model = it.model.filterNot { itemModel -> itemModel.text == selectItem.text }
)
}
}
}
// view + controller
@Composable
fun CounterController(viewModel:CounterViewModel = hiltViewModel()) {
val state by viewModel.state.collectAsState()
ShowItems(
state = state,
onClick = viewModel::onClick
)
}
@Composable
fun ShowItems(state: ItemUiState = ItemUiState(),onClick:(ItemModel)-> Unit = {}) {
items(count = state.model.size, key = { state.model[it].text }) { index ->
val item = state.model[index]
LazyColumn(
contentPadding = PaddingValues(15.dp),
verticalArrangement = Arrangement.spacedBy(10.dp),
modifier = Modifier
.fillMaxSize()
.padding(paddingValues)
) {
items(count = state.model.size, key = { state.model[it].text }) { index ->
val item = state.model[index]
Card(
shape = RoundedCornerShape(15.dp),
modifier = Modifier
.fillMaxWidth()
.combinedClickable(
onClick = { onClick(item) },
).padding(bottom = expandedPadding.coerceAtLeast(0.dp))
.animateItemPlacement()
)
}
شرح الكود تنفيذ عملية الحذف
ما هي مكونات الكود؟ نحتاج أولاً إلى فهم مكونات الكود. يحتوي الكود على جزأين رئيسيين اولا : ViewModel وهو المسؤول عن تخزين وإدارة الحالة.ثانيا UI: والتي تعرض العناصر على الشاشة وتتفاعل مع المستخدم.
ما هي وظيفة ViewModel ؟
الجزء الأول من التعليمات البرمجية هو CounterViewModel الذي يستخدم مكتبة Hilt لحقن التبعية. يحتوي هذا الرمز على MutableStateFlow لتخزين حالة ItemUiState , توجد وظيفة onClick تأخذ عنصرًا محددًا (ItemModel) وتزيله من القائمة المخزنة مؤقتًا.
- تم وضع key = { state.model[it].text } , لمعرفة key الذي سوف يتم الحذف عنده وترتيب ما اسفله
- animateItemPlacement() لتنفيذ عملية الانميشن بدون تعقيد
انميشن خلال عملية padding في kotlin compose
@Composable
fun ShowItems(state: ItemUiState = ItemUiState(),onClick:(ItemModel)-> Unit = {}) {
var expanded by remember { mutableStateOf(false) }
val expandedPadding by animateDpAsState(
if (expanded) 20.dp else 0.dp,
animationSpec = spring(
dampingRatio = Spring.DampingRatioMediumBouncy,
stiffness = Spring.StiffnessLow
)
)
Card(
shape = RoundedCornerShape(15.dp),
modifier = Modifier
.fillMaxWidth()
.combinedClickable(
onLongClick = {
expanded = !expanded
},
).padding(bottom = expandedPadding.coerceAtLeast(0.dp))
.animateItemPlacement()
)
}
شرح كود انميشن التوسيع
شرح AnimatedVisibility واضافة تاثيرات عليه
// enter = fadeIn() , exit = fadeOut()
// enter = slideInHorizontally() , exit = slideOutHorizontally()
// enter = scaleIn() , exit = scaleOut()
// enter = expandIn() , exit = shrinkOut()
// enter = fadeIn() + scaleIn() , exit = fadeOut() + scaleOut()
// enter = slideInHorizontally{it} , exit = slideOutHorizontally{-it}
AnimatedVisibility(visible = isCheck , enter = slideIn{ IntOffset(-it.width,0) } , exit = slideOut{ IntOffset(it.width,0) }) {
Text(text = "Test")
}
شرح انواع التاثرات في الانميشن داخل كوتلن كومبوس
حيل الأنيميشن التي ستغير طريقة تصميمك للتطبيقات للأبد
AnimatedVisibility(visible = isCheck , enter = slideIn{ IntOffset(-it.width,0) } , exit = slideOut{ IntOffset(it.width,0) }) {
Box(modifier = Modifier
.clip(CircleShape)
.background(Color.Yellow)) {
Icon(
Icons.Filled.Menu,
"menu",
modifier = Modifier
.padding(16.dp)
.animateEnterExit(
enter = slideInVertically { -it },
exit = slideOutVertically { it },
))
}
}
هل تريد تحسين واجهة المستخدم؟ جرب هذه الأنيميشن الاحترافية الآن
var message by remember { mutableStateOf("") }
Button(onClick = {
message += "GeeCoders"
}) {
}
Box(modifier = Modifier
.padding(15.dp)
.animateContentSize(
animationSpec = tween(2000)
)){
Text("message : ${message}")
}
سر الأنيميشن المستمرة في واجهات التطبيقات باستخدام Kotlin Compose!
val colorTransition = rememberInfiniteTransition()
val color by colorTransition.animateColor(
initialValue = Color.Blue,
targetValue = Color.Green,
animationSpec = InfiniteRepeatableSpec(
tween(2000),
repeatMode = RepeatMode.Reverse
),
label = "Change Color"
)
Box(modifier = Modifier
.padding(15.dp)
.background(color)
.animateContentSize(
animationSpec = tween(2000)
)){
Text("message : ${message}")
}
يتم إنشاء InfiniteTransition باستخدام RememberInfiniteTransition(). يتيح لك هذا النوع من الانتقال تشغيل رسوم متحركة مستمرة ومتكررة دون توقف.
اللون المتحرك: يتم إنشاء الرسوم المتحركة الملونة باستخدام animateColor:القيمة الأولية = اللون الأزرق: اللون الرئيسي هو الأزرق. القيمة المستهدفة = اللون . الأخضر: الهدف النهائي للرسوم المتحركة هو اللون الأخضر.
AnimationSpec = InfiniteRepeatableSpec(...):هنا، يتم استخدام InfiniteRepeatableSpec لتكرار الرسوم المتحركة إلى ما لا نهاية. توين (2000): تحدد هذه الخاصية مدة الرسوم المتحركة إلى 2000 مللي ثانية (ثانيتين).
RepeatMode.Reverse : وهذا يعني أن الرسوم المتحركة سوف تنعكس بعد إصابة الهدف (أي أنها ستتغير من الأزرق إلى الأخضر، من الأخضر إلى الأزرق). حيث يتغير لون الصندوق باستمرار بألوان متحركة
كيف تجعل تجربة المستخدم أكثر جاذبية بالمقاسات المتحركة
val transition = rememberInfiniteTransition()
val sizeTransition by transition.animateFloat(
initialValue = 15f,
targetValue = 30f,
animationSpec = InfiniteRepeatableSpec(
tween(2000),
repeatMode = RepeatMode.Reverse
),
label = "Change Color"
)
Box(modifier = Modifier
.padding(15.dp)
.height(sizeTransition.dp)
.animateContentSize(
animationSpec = tween(2000)
)
كيف تضيف أنيميشن تفاعلية مبهرة في تطبيقاتك باستخدام Kotlin/Compose
val sizeTransition = updateTransition(targetState = isCheck)
val changeColor by sizeTransition.animateColor {
if (it) Color.Red else Color.Blue
}
val changeSize by sizeTransition.animateDp(
label = "",
transitionSpec = {
spring(
dampingRatio = Spring.DampingRatioMediumBouncy,
stiffness = Spring.StiffnessMedium,
)
},
) {
if (it) 100.dp else 50.dp
}
val randColor = remember { Animatable(Color.Blue) }
Box(modifier = Modifier
.clip(CircleShape)
.width(changeSize)
.background(changeColor)) {}
Box(
modifier = Modifier
.clip(CircleShape)
.background(randColor.value)
) {}
LaunchedEffect(key1 = Unit) {
val colors = listOf(Color.Blue,Color.Green,Color.Yellow,Color.Magenta,Color.Red)
colors.forEach() {
randColor.animateTo(it)
delay(2000)
}
}