البداية · فصل ١

الحركة في Filee جاية منين؟

Avalonia · Skia · Transitions · Keyframes · DrawingContext · RequestAnimationFrame
🎯 الهدف: تفرّق بين الطريقتين اللي Filee بيحرّك بيهم، وتعرف التلات حاجات اللي بتخلي الحركة طرية.

Filee معمول بـ C# و Avalonia. Avalonia بترسم كل حاجة بنفسها بـ Skia (نفس محرك الرسم بتاع Chrome و Flutter)، فالحركة شغالة بنفس النعومة على ويندوز وماك ولينكس.

لما تفتح الكود، هتلاقي طريقتين بس للحركة، ومفيش أي مكتبة أنيميشن خارجية.

الطريقة الأولى: transitions في الـ styles

دي لكل حاجة عادية: زراير، chips، ألوان، عناصر الـ sidebar. بتقول للعنصر “لو الخاصية دي اتغيرت، اتحرك ليها في وقت كذا بمنحنى كذا”. ده بالظبط transition بتاع CSS.

Styles/Soft.axaml (Filee)
<Style Selector="Button, ToggleButton, RepeatButton">  <Setter Property="Transitions">    <Transitions>      <TransformOperationsTransition Property="RenderTransform"                                     Duration="0:0:0.22"                                     Easing="{StaticResource SoftEase}" />    </Transitions>  </Setter></Style><Style Selector="Button:pressed, ToggleButton:pressed">  <Setter Property="RenderTransform" Value="scale(0.95)" /></Style>

ومعاها keyframes للحاجات اللي بتظهر مرة واحدة، زي الـ toast وفتح الصفحة. ده @keyframes بتاع CSS.

الطريقة التانية: ترسم بإيدك وتحسب كل فريم

الدونت مش زراير. هو control اسمه DonutMenu بيعمل override لـ Render(DrawingContext) وبيرسم كل شريحة بالخطوط والأقواس. وكل فريم بيطلب الفريم اللي بعده بـ RequestAnimationFrame، وبيحسب القيم بـ spring هو كاتبها بنفسه.

على الويب ده يساوي: canvas + requestAnimationFrame + حاجة زي react-spring.

التلات حاجات اللي بتعمل “الطراوة”

١. BackEaseOut في كل حتة

منحنى بيعدّي الهدف شعرة ويرجع. Filee حاطه في resource واحد اسمه SoftEase وكل الزراير بتستخدمه. الفصل الجاي كله عنه.

٢. springs بدل مدة ثابتة

في الدونت، الحركة ملهاش “مدة”. ليها قوة وتقل. لو غيّرت الهدف في النص، الحركة بتكمل من سرعتها الحالية من غير ما تقطع.

٣. مدد قصيرة

من ٠.١٥ لـ ٠.٤٢ ثانية بس. الألوان ١٥٠ms، الزراير ٢٢٠ms، الدونت ٤٢٠ms. أطول من كده تحس الأبلكيشن تقيل.

+ الفتح غير القفل

الفتح بينط وبياخد وقته. القفل سريع ومن غير نطة (١٦٠ms). اللي بيقفل حاجة عايزها تمشي، مش عايز يتفرج عليها.

الخريطة: Filee قصاد الويب

اللي بتشوفهفي Fileeعلى الويب
زرار بيتكبسTransformOperationsTransition + BackEaseOuttransition: transform + cubic-bezier
لون بيتغير بنعومةBrushTransition 0.15stransition: background-color .15s
ظل كارتBoxShadowsTransitiontransition: box-shadow
toast بيدخلStyle.Animations + KeyFrame@keyframes
الدونتRender(DrawingContext) + Springcanvas + requestAnimationFrame + spring
حركة أقلكلاس reduced-motion على الشباكprefers-reduced-motion

خلّصت الفصل لما

🧠 اختبر نفسك
١) ليه الدونت مش معمول بزراير عادية؟
لأنه شكل دايري بشرايح، وحركته معتمدة على الماوس في كل لحظة. أسهل وأسرع ترسمه بإيدك وتحسب كل فريم بـ spring.
٢) إيه الفرق بين transition و keyframes؟
الـ transition بيتحرك لما خاصية تتغير (hover مثلًا). الـ keyframes بيشتغل لوحده من أول ما الـ style ينطبق، زي العنصر وهو بيظهر.
٣) ليه القفل أسرع من الفتح؟
لأن اللي بيقفل خلص من الحاجة. نطة وهي بتقفل بتحسسك إنها لسه مستنياك.