الفرق بين المراجعتين ل"ReactNative/animated"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(رفع المحتوى)
 
ط
 
(22 مراجعة متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:المكون Animated في ReactNative}}</noinclude>
+
<noinclude>{{DISPLAYTITLE:الواجهة Animated في ReactNative}}</noinclude>
صُمِّمَت واجهة ‎<code>Animated</code>‎ البرمجيّة لتسهيل التعبير عن مجموعة متنوعة من أنماط التحريك والتفاعل بطريقة فائقة الأداء. تركّز واجهة ‎<code>Animated</code>‎ على العلاقات التعريفية بين المدخلات (inputs) والمخرجات (outputs)، مع وجود تحويلات قابلة للضّبط بينهما، إضافة إلى تابعي ‎<code>start</code>‎ و‎<code>stop</code>‎ بسيطين للتحكم في تنفيذ التّحريك على أساس الوقت.
+
صُمِّمَت واجهة ‎<code>Animated</code>‎ البرمجيّة لتسهيل التعبير عن مجموعة متنوعة من أنماط التحريك والتفاعل بطريقة فائقة الأداء. تركّز واجهة ‎<code>Animated</code>‎ على العلاقات التعريفية بين المدخلات (inputs) والمخرجات (outputs)، مع وجود تحويلات قابلة للضّبط بينهما، إضافة إلى تابعَي ‎<code>start</code>‎ و‎<code>stop</code>‎ بسيطين للتحكم في تنفيذ التّحريك على أساس الوقت.
  
لإنشاء تأثير حركي عليك أولًا البدء بإنشاء متغير <code>Animated.Value</code> وربطه بواحدة أو أكثر من أنماط المكون المتحركة ودفع التحديثات عبر التأثيرات الحركية باستخدام الدالة <code>Animated.timing()</code>.
+
لإنشاء تأثير حركي عليك أولًا البدء بإنشاء متغيّر <code>Animated.Value</code> وربطه بواحدة أو أكثر من أنماط المكون المتحركة ودفع التحديثات عبر التأثيرات الحركية باستخدام الدالة <code>()Animated.timing</code>.
  
'''مثال''': استخدام مكون دالِّي (Function component)
+
== مثال ==
 +
إليك المثال التالي الذي تحوي المكون <code>View</code> والذي سيظهر ويختفي بتأثير التلاشي بناء على قيمة <code>fadeAnim</code>.
  
عند استخدام المكونات الدالِّية لإنشاء التأثيرات الحركية يجب عدم تعديل قيمة <code>animmated.value</code> بشكل مباشر، وإنما يجب استخدام الخطاف [https://wiki.hsoub.com/React/hooks_reference#useRef <code>useRef</code>] لإرجاع كائن مرجعي قابل للتعديل. تتم تهئية الخاصية <code>current</code> للكائن <code>ref</code> على أنها المعاملات المبدئية، وتستمر طوال دورة حياة المكون.
+
=== استخدام مكون دالة (Function component) ===
 +
عند استخدام المكونات الدالِّية لإنشاء التأثيرات الحركية يجب عدم تعديل قيمة <code>animmated.value</code> مباشرةً، وإنما يجب استخدام الخطاف <code>[[React/hooks reference#useRef|useRef]]</code> لإرجاع كائن مرجعي قابل للتعديل، وتُهيّئ الخاصية <code>current</code> للكائن <code>ref</code> على أنّها المعاملات المبدئية، وتستمر طوال دورة حياة المكون.
  
<syntaxhighlight class="react">import React, { useRef } from "react";
+
إليك المثال ([https://snack.expo.dev/iw1hGSjz1 تجربة حية]):
import { Animated, Text, View, StyleSheet, Button } from "react-native";
+
 
 +
<syntaxhighlight class="react" lang="javascript">import React, { useRef } from "react";
 +
import { Animated, Text, View, StyleSheet, Button, SafeAreaView } from "react-native";
  
 
const App = () => {
 
const App = () => {
سطر 24: سطر 28:
  
 
   const fadeOut = () => {
 
   const fadeOut = () => {
     // Will change fadeAnim value to 0 in 5 seconds
+
     // Will change fadeAnim value to 0 in 3 seconds
 
     Animated.timing(fadeAnim, {
 
     Animated.timing(fadeAnim, {
 
       toValue: 0,
 
       toValue: 0,
       duration: 5000
+
       duration: 3000
 
     }).start();
 
     }).start();
 
   };
 
   };
  
 
   return (
 
   return (
     <View style={styles.container}>
+
     <SafeAreaView style={styles.container}>
 
       <Animated.View
 
       <Animated.View
 
         style={[
 
         style={[
 
           styles.fadingContainer,
 
           styles.fadingContainer,
 
           {
 
           {
             opacity: fadeAnim // Bind opacity to animated value
+
             // Bind opacity to animated value
 +
            opacity: fadeAnim
 
           }
 
           }
 
         ]}
 
         ]}
سطر 44: سطر 49:
 
       </Animated.View>
 
       </Animated.View>
 
       <View style={styles.buttonRow}>
 
       <View style={styles.buttonRow}>
         <Button title="Fade In" onPress={fadeIn} />
+
         <Button title="Fade In View" onPress={fadeIn} />
         <Button title="Fade Out" onPress={fadeOut} />
+
         <Button title="Fade Out View" onPress={fadeOut} />
 
       </View>
 
       </View>
     </View>
+
     </SafeAreaView>
 
   );
 
   );
 
}
 
}
سطر 58: سطر 63:
 
   },
 
   },
 
   fadingContainer: {
 
   fadingContainer: {
     paddingVertical: 8,
+
     padding: 20,
    paddingHorizontal: 16,
 
 
     backgroundColor: "powderblue"
 
     backgroundColor: "powderblue"
 
   },
 
   },
 
   fadingText: {
 
   fadingText: {
     fontSize: 28,
+
     fontSize: 28
    textAlign: "center",
 
    margin: 10
 
 
   },
 
   },
 
   buttonRow: {
 
   buttonRow: {
     flexDirection: "row",
+
     flexBasis: 100,
 +
    justifyContent: "space-evenly",
 
     marginVertical: 16
 
     marginVertical: 16
 
   }
 
   }
سطر 75: سطر 78:
 
export default App;</syntaxhighlight>
 
export default App;</syntaxhighlight>
  
 +
=== استخدام مكون صنف (Class component) ===
 +
عند استخدام مكون صنفي لإنشاء التأثيرات الحركية يجب عدم تعديل قيمة <code>animmated.value</code>  مباشرةً، وإنما يجب تخزينها في صورة متغيّر في الحالة الخاصة بالمكون <code>[[ReactNative/intro react#.D8.A7.D9.84.D8.AD.D8.A7.D9.84.D8.A9 State|state]]</code>.
  
'''مثال''': استخدام مكون صنفي (Class component)
+
إليك المثال ([https://snack.expo.dev/@hsoubwiki/animated-class-component تجربة حية]):
__toc__
+
<syntaxhighlight class="react" lang="javascript">import React, { Component } from "react";
استخدام المكونات الصنفية لإنشاء التأثيرات الحركية يجب عدم تعديل قيمة <code>animmated.value</code> بشكل مباشر، وإنما يجب تخزينها كمتغير في [https://reactnative.dev/docs/intro-react#state الحالة الخاصة بالمكون].
+
import { Animated, Text, View, StyleSheet, Button, SafeAreaView } from "react-native";
 
 
<syntaxhighlight class="react">import React, { Component } from "react";
 
import { Animated, Text, View, StyleSheet, Button } from "react-native";
 
  
 
class App extends Component {
 
class App extends Component {
سطر 98: سطر 100:
  
 
   fadeOut = () => {
 
   fadeOut = () => {
     // Will change fadeAnim value to 0 in 5 seconds
+
     // Will change fadeAnim value to 0 in 3 seconds
 
     Animated.timing(this.state.fadeAnim, {
 
     Animated.timing(this.state.fadeAnim, {
 
       toValue: 0,
 
       toValue: 0,
       duration: 5000
+
       duration: 3000
 
     }).start();
 
     }).start();
 
   };
 
   };
سطر 107: سطر 109:
 
   render() {
 
   render() {
 
     return (
 
     return (
       <View style={styles.container}>
+
       <SafeAreaView style={styles.container}>
 
         <Animated.View
 
         <Animated.View
 
           style={[
 
           style={[
 
             styles.fadingContainer,
 
             styles.fadingContainer,
 
             {
 
             {
               opacity: this.state.fadeAnim // Bind opacity to animated value
+
              // Bind opacity to animated value
 +
               opacity: this.state.fadeAnim
 
             }
 
             }
 
           ]}
 
           ]}
سطر 119: سطر 122:
 
         </Animated.View>
 
         </Animated.View>
 
         <View style={styles.buttonRow}>
 
         <View style={styles.buttonRow}>
           <Button title="Fade In" onPress={this.fadeIn} />
+
           <Button title="Fade In View" onPress={this.fadeIn} />
           <Button title="Fade Out" onPress={this.fadeOut} />
+
           <Button title="Fade Out View" onPress={this.fadeOut} />
 
         </View>
 
         </View>
       </View>
+
       </SafeAreaView>
 
     );
 
     );
 
   }
 
   }
سطر 134: سطر 137:
 
   },
 
   },
 
   fadingContainer: {
 
   fadingContainer: {
     paddingVertical: 8,
+
     padding: 20,
    paddingHorizontal: 16,
 
 
     backgroundColor: "powderblue"
 
     backgroundColor: "powderblue"
 
   },
 
   },
 
   fadingText: {
 
   fadingText: {
     fontSize: 28,
+
     fontSize: 28
    textAlign: "center",
 
    margin: 10
 
 
   },
 
   },
 
   buttonRow: {
 
   buttonRow: {
     flexDirection: "row",
+
     flexBasis: 100,
 +
    justifyContent: "space-evenly",
 
     marginVertical: 16
 
     marginVertical: 16
 
   }
 
   }
سطر 150: سطر 151:
  
 
export default App;</syntaxhighlight>
 
export default App;</syntaxhighlight>
إرجع إلى [https://reactnative.dev/docs/animations#animated-api دليل التأثيرات الحركية] لمزيد من الأمثلة.
+
ارجع إلى [[ReactNative/animations#%D9%88%D8%A7%D8%AC%D9%87%D8%A9%20Animated%20%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9|دليل التأثيرات الحركية]] لمزيد من الأمثلة.
 
 
 
 
 
== نظرة عامة ==
 
== نظرة عامة ==
  
 
هناك نوعان من البيانات يمكن استخدامهم مع المكون <code>Animated</code> هما:
 
هناك نوعان من البيانات يمكن استخدامهم مع المكون <code>Animated</code> هما:
  
* <code>Animated.Value()</code>: للقيم المُفردة.
+
* <code>()Animated.Value</code>: للقيم المُفردة.
* <code>Animated.ValueXY()</code>: للمُتجهات.
+
* <code>()Animated.ValueXY</code>: للمُتجهات.
  
يمكن أن ترتبط <code>Animated.Value</code> بخصائص النمط أو الخواص الأخرى. ويمكن أن تؤدي قيمة <code>Animated.Value</code> واحدة العديد من الخصائص.
+
قد ترتبط <code>Animated.Value</code> بخصائص النمط أو الخواص الأخرى، كما قد تؤدّي قيمة <code>Animated.Value</code> واحدة العديد من الخصائص.
  
 
=== إنشاء وضبط التأثيرات الحركية ===
 
=== إنشاء وضبط التأثيرات الحركية ===
  
يوفر المكون <code>Animated</code> ثلاثة أنواع من التأثيرات الحركية يُمثل كلٌّ منها منحنى حركة معين يتحكم في معدل تغير قيمة التأثير الحركي من القيمة الأولية إلى القيمة النهائية.
+
يوفر المكون <code>Animated</code> ثلاثة أنواع من التأثيرات الحركية يُمثّل كلٌّ منها منحنى حركة معيّن يتحكم في معدَّل تغير قيمة التأثير الحركي من القيمة الأولية إلى القيمة النهائية.
  
* <code>Animated.decay()</code>: تبدأ بسرعة أولية و يتباطأ ندريجيًا حتى أن يتوقف.
+
* <code>()Animated.decay</code>: يبدأ بسرعة أولية و يتباطأ تدريجيًا حتى يتوقف.
* <code>Animated.spring</code>: تُمثل نموذجًا اساسيًا لفيزياء النوابض.
+
* <code>Animated.spring</code>: تُمثل نموذجًا أساسيًا لفيزياء النوابض.
** <code>Animated.timing</code>: يُغيِّر قيمة التأثير الحركي مع مرور الزمن باستخدام دوال التسارع (easing functions).
+
*<code>Animated.timing</code>: يُغيِّر قيمة التأثير الحركي مع مرور الزمن باستخدام دوال التسارع (easing functions).
  
في أغلب الأحيان تُستعمل الدالة <code>timing()</code>، والتي تستخدم منحنى <code>easeInOut</code> بشكل إفتراضي. هذا المنحنى يمثل التسارع التدريجي لجسمٍ ما إلى أقصى سرعة ثم التباطؤ تدريجيًأ حتى التوقف.
+
في أغلب الأحيان تُستعمل الدالة <code>()timing</code>، والتي تستخدم منحنى <code>easeInOut</code> إفتراضيًّا. هذا المنحنى يمثل التسارع التدريجي لجسمٍ ما إلى أقصى سرعة ثم التباطؤ تدريجيًأ حتى التوقف.
 +
=== التعامل مع التأثيرات الحركية ===
  
 +
تبدأ التأثيرات الحركية عن طريق استدعاء الدالة <code>()start</code> على التأثير الحركي. تأخذ الدالة <code>start</code> رد نداء (callback) يُستدعى عند انتهاء التأثير الحركي، حيثُ تكون قيمة المعامل <code>finished</code> فيه هي <code>true</code> إذا اكتمل التأثير الحركي بنجاح وحينها يتم استدعاء دالة إيقاف التأثير الحركي <code>stop</code>، وتكون قيمته <code>false</code> فيما عدا ذلك.
  
 
+
<syntaxhighlight class="react" lang="javascript">Animated.timing({}).start(({ finished }) => {
== التعامل مع التأثيرات الحركية ==
 
 
 
تبدأ التأثيرات الحركية عن طريق استدعاء الدالة <code>start()</code> على التأثير الحركي. تأخذ الدالة <code>start</code> رد نداء (callback) يُستدعى عند انتهاء التأثير الحركي، حيثُ تكون قيمة المعامل <code>finished</code> فيه هي <code>true</code> إذا اكتمل التأثير الحركي بنجاح وحينها يتم استدعاء دالة إيقاف التأثير الحركي <code>stop</code>، وتكون قيمته <code>false</code> فيما عدا ذلك.
 
 
 
<syntaxhighlight class="react">Animated.timing({}).start(({ finished }) => {
 
 
   /* completion callback */
 
   /* completion callback */
 
});</syntaxhighlight>
 
});</syntaxhighlight>
+
=== استخدام برامج التشغيل الأصلية ===
  
== استخدام برامج التشغيل الأصليّة ==
+
المُشغِّل الأصلي (Native driver) يُحوِّل جميع المعلومات الخاصة بالتأثير الحركي المُراد إنشاءه إلى شيفرة أصلية (Native Code) قبل بدء التنفيذ، مما يسمج للشيفرة الأصلية بتنفيذ التأثيرات على واجهة المستخدم مباشرة دون المرور بالجسر الذي يربط بين شيفرة [[ReactNative|React Native]] والشيفرة الأصلية.
  
المُشغِّل الأصلي (Native driver) يُحوِّل جميع المعلومات الخاصة بالتأثير الحركي المُراد إنشاءه إلى شيفرة أصلية (Native Code) قبل بدء التنفيذ، مما يسمج للشيفرة الأصلية بتنفيذ التأثيرات على واجهة المستخدم مباشرة دون المرور بالجسر الذي يربط بين شيفرة React Native والشيفرة الأصلية.  
+
يمكن تفعيل استخدام المشغلات الأصلية من خلال إعطاء الخاصية <code>useNativeDriver</code> القيمة <code>true</code>. لمزيد من المعلومات [https://wiki.hsoub.com/ReactNative/animations#.D8.A7.D8.B3.D8.AA.D8.AE.D8.AF.D8.A7.D9.85_.D8.A7.D9.84.D9.85.D8.B4.D8.BA.D9.84_.D8.A7.D9.84.D8.A3.D8.B5.D9.8A.D9.84_.28native_driver.29 انظر دليل التأثيرات الحركية].
 +
=== المكونات القابلة للتحريك ===
  
يمكن تفعيل استخدام المشغلات الأصلية من خلال إعطاء الخاصية <code>useNativeDriver</code> القيمة <code>true</code> . لمزيد من المعلومات [https://wiki.hsoub.com/ReactNative/animations#.D8.A7.D8.B3.D8.AA.D8.AE.D8.AF.D8.A7.D9.85_.D8.A7.D9.84.D9.85.D8.B4.D8.BA.D9.84_.D8.A7.D9.84.D8.A3.D8.B5.D9.8A.D9.84_.28native_driver.29 انظر دليل التأثيرات الحركية].
+
يمكن تطبيق التأثيرات الحركية على المكونات القابلة للتحريك فقط، حيث تستطيع هذه المكونات الربط بين القيم المختلفة للخصائص والانتقال بينها بطريقة سلسة عن طريق عمل تحديثات بسيطة للمكون في كلّ مرّة لتجنب إعادة رسمه بالكامل. وكذلك لديهم القابلية لتنفيذ عمليات التنظيف عند حذف المكون من شاشة العرض.
  
 
+
تُستخدم الدالة <code>()createAnimatedComponent</code> لإنشاء مكوّنات قابلة للتحريك.
 
 
== المكونات القابلة للتحريك ==
 
 
 
يمكن تطبيق التأثيرات الحركية على المكونات القابلة للتحريك فقط، حيث تستطيع هذه المكونات الربط بين القيم المختلفة للخصائص والانتقال بينها بطريقة سلسة عن طريق عمل تحديثات بسيطة للمكون في كل مرة لتجنب إعادة رسمه بالكامل. وكذلك لديهم القابلية لتنفيذ عمليات التنظيف عند حذف المكون من شاشة العرض.
 
 
 
تُستخدم الدالة <code>createAnimatedComponent()</code> لإنشاء مكونات قابلة للتحريك.
 
  
 
يشمل المكون <code>Animated</code> المكونات التالية:
 
يشمل المكون <code>Animated</code> المكونات التالية:
سطر 206: سطر 197:
 
* <code>Animated.SectionList</code>
 
* <code>Animated.SectionList</code>
  
== تركيب التأثيرات الحركية ==
+
=== تركيب التأثيرات الحركية ===
  
 
يُمكن تركيب التأثيرات الحركية المختلفة لإنشاء تأثيرات أكثر تعقيدًا عن طريق استخدام دوال الدمج.
 
يُمكن تركيب التأثيرات الحركية المختلفة لإنشاء تأثيرات أكثر تعقيدًا عن طريق استخدام دوال الدمج.
  
* <code>Animated.delay()</code>: تؤخِّر بدء تنفيذ التحريك بقدار زمني معين.
+
* <code>()nimated.delay</code>: تؤخِّر بدء تنفيذ التحريك بمقدار زمنيّ معيّن.
* <code>Animated.parallel()</code>: تبدأ تنفيذ عدد من التأثيرات الحركية في نفس الوقت.
+
* <code>()Animated.parallel</code>: تبدأ تنفيذ عدد من التأثيرات الحركية في نفس الوقت.
* <code>Animated.squence()</code>: تُنفِّذ التأثيرات الحركية واحدًا تلوَ الآخر بشكل تسلسلي.
+
* <code>()Animated.squence</code>: تُنفِّذ التأثيرات الحركية واحدًا تلوَ الآخر بالتسلسل.
* <code>Animated.stagger()</code>: تبدأ التأثيرات الحركية بشكل متوازي ومتسلسل، ولكن مع تتأخيرات متتالية.  
+
* <code>()Animated.stagger</code>: تبدأ التأثيرات الحركية متوازيةً ومتسلسلة، ولكن مع تأخيرات متتالية.
 
 
ويمكن أيضًأ ربط التأثيرات الحركية ببعضها البعض عن طريق تعيين قيمة الخاصية <code>toValue</code> لأحد التأثيرات لتكون <code>Animated.Value</code>. انظر [https://wiki.hsoub.com/ReactNative/animations#.D8.AA.D8.AA.D8.A8.D8.B9_.D8.A7.D9.84.D9.82.D9.8A.D9.85_.D8.A7.D9.84.D8.AF.D9.8A.D9.86.D8.A7.D9.85.D9.8A.D9.83.D9.8A.D8.A9 تتبع القيم في دليل التأثيرات الحركية].
 
 
 
 
 
  
 +
ويمكن أيضًأ ربط التأثيرات الحركية ببعضها البعض عن طريق تعيين قيمة الخاصية <code>toValue</code> لأحد التأثيرات لتكوّن <code>Animated.Value</code>. انظر [https://wiki.hsoub.com/ReactNative/animations#.D8.AA.D8.AA.D8.A8.D8.B9_.D8.A7.D9.84.D9.82.D9.8A.D9.85_.D8.A7.D9.84.D8.AF.D9.8A.D9.86.D8.A7.D9.85.D9.8A.D9.83.D9.8A.D8.A9 تتبع القيم في دليل التأثيرات الحركية].
 
=== دمج التأثيرات الحركية ===
 
=== دمج التأثيرات الحركية ===
  
 
يمكن دمج التأثيرات الحركية عن طريق عمليات الجمع، والطرح، والضرب، والقسمة، وباقي القسمة للحصول على تأثيرات حركية جديدة.
 
يمكن دمج التأثيرات الحركية عن طريق عمليات الجمع، والطرح، والضرب، والقسمة، وباقي القسمة للحصول على تأثيرات حركية جديدة.
  
* <code>Animated.add()</code>
+
* <code>()Animated.add</code>
* <code>Animated.subtract()</code>
+
* <code>()Animated.subtract</code>
* <code>Animated.divide()</code>
+
* <code>()Animated.divide</code>
* <code>Animated.modulo()</code>
+
* <code>()Animated.modulo</code>
* <code>Animated.multiply()</code>
+
* <code>()Animated.multiply</code>
 
+
=== الاستيفاء ===
  
 
+
تُستخدم الدالة <code>interpolate</code> لتحديد مدى معيّن للمُدخلات للحصول على مُخرجات في مدى معيّن آخر. حيث تقرأ افتراضيًّا المنحنى خارج المدى المحدَّد، ولكن يمكنك جعله يثبّت قيمة المخرجات. تستخدم الدالة الاستيفاء الخطي افتراضيًّأ ولكنها تدعم جميع وظائف التحريك (easing functions).
== الاستيفاء ==
 
 
 
تستخدم الدالة <code>interpolate</code> لتحديد مدى معين للمُدخلات للحصول على مُخرجات في مدى معين آخر. حيث تقوم بشكل إفتراضي بقراءة المنحنى خارج المدى المحدد، ولكن يمكنك أن تجعله يثبت قيمة المخرجات. تستخدم الدالة الاستيفاء الخطي بشكل افتراضي ولكنها تدعم جميع وظائف التحريك (easing functions).
 
  
 
[https://wiki.hsoub.com/ReactNative/animations#.D8.A7.D9.84.D8.A7.D8.B3.D8.AA.D9.8A.D9.81.D8.A7.D8.A1_.28Interpolation.29 انظر دليل التأثيرات الحركية.]
 
[https://wiki.hsoub.com/ReactNative/animations#.D8.A7.D9.84.D8.A7.D8.B3.D8.AA.D9.8A.D9.81.D8.A7.D8.A1_.28Interpolation.29 انظر دليل التأثيرات الحركية.]
 +
=== التعامل مع الإيماءات والأحداث الأخرى ===
  
 
+
يمكن تحديد قيم للإيماءات، مثل التحريك أو التمرير، والأحداث الأخرى باستخدام الدالة <code>()Animated.event</code> ، حيث تُستخدم بنية الخريطة الهيكلية لاستخراج القيم من الكائنات المعقدة.
 
 
== التعامل مع الإيماءات والأحداث الأخرى ==
 
 
 
يمكن تحديد قيم للإيماءات، مثل التحريك أو التمرير، والأحداث الأخرى باستخدام الدالة <code>Animated.event()</code> ، حيث تُستخدم بنية الخريطة الهيكلية لاستخراج القيم من الكائنات المعقدة.
 
  
 
المستوى الأول عبارة عن مصفوفة تسمح باستخراج البيانات عبر العديد من الوسائط، وتحتوي هذه المجموعة على كائنات متداخلة.
 
المستوى الأول عبارة عن مصفوفة تسمح باستخراج البيانات عبر العديد من الوسائط، وتحتوي هذه المجموعة على كائنات متداخلة.
  
* <code>[Animated.event()</code>.](https://reactnative.dev/docs/animated#event)
+
* <code>[[ReactNative/animated#event()|A]]<nowiki/>[[ReactNative/animated#event()|nimated.event()‎]]</code>
  
 
عند التعامل مع إيماءات التمرير الأفقي على سبيل المثال، يمكنك القيام بما يلي من أجل تعيين <code>event.nativeEvent.contentOffset.x</code> إلى <code>scrollY</code>.
 
عند التعامل مع إيماءات التمرير الأفقي على سبيل المثال، يمكنك القيام بما يلي من أجل تعيين <code>event.nativeEvent.contentOffset.x</code> إلى <code>scrollY</code>.
  
<syntaxhighlight class="react"> onScroll={Animated.event(
+
<syntaxhighlight class="react" lang="javascript"> onScroll={Animated.event(
 
   // scrollX = e.nativeEvent.contentOffset.x
 
   // scrollX = e.nativeEvent.contentOffset.x
 
   [{ nativeEvent: {
 
   [{ nativeEvent: {
سطر 258: سطر 240:
 
     }]
 
     }]
 
  )}</syntaxhighlight>
 
  )}</syntaxhighlight>
 
 
 
== التوابع ==
 
== التوابع ==
  
'''ملاحظة''' عندما استخدام <code>ValueXY</code> بدلًا عن <code>Value</code> لإستقبال المُدخلات، فإن خيارات الضبط (Config options) تُصبح متجهات (vectors) بدلًا عن قيم قياسية (أرقام).
+
'''ملاحظة''' عندما استخدام <code>ValueXY</code> بدلًا عن <code>Value</code> لاستقبال المُدخلات، فستُصبح خيارات الضبط (Config options) مجموعة متجهات (vectors) من الشكل <code>{x: ..., y: ...‎}</code> بدلًا عن قيم قياسية (أرقام).
 
 
=== <code>decay()</code> ===
 
  
<syntaxhighlight class="react">static decay(value, config)</syntaxhighlight>
+
=== <code>decay()‎</code> ===
تُحرك قيمة معينة من السرعة الإبتدائية إلى الصفر بمعدل معين.
+
<syntaxhighlight class="react" lang="javascript">static decay(value, config)</syntaxhighlight>
 +
تُحرك قيمة معيّنة من السرعة الإبتدائية إلى الصفر بمعدَّل معيّن.
  
 
يحتوي الكائن <code>config</code> على خيارات التحريك وهي:
 
يحتوي الكائن <code>config</code> على خيارات التحريك وهي:
  
 
* <code>velocity</code>: (مطلوب) ويمثل السرعة الإبتدائية.
 
* <code>velocity</code>: (مطلوب) ويمثل السرعة الإبتدائية.
* <code>deceleration</code>: معدل التباطؤ. القيمة الافتراضية هي 0.997.
+
* <code>deceleration</code>: معدَّل التباطؤ، والقيمة الافتراضية هي 0.997.
* <code>isInteraction</code>: تُحدد ما إذا كان التأثير الحركي سيُنشئ مُتحكِّم تفاعلي (interaction handle) في <code>interacionManager</code>أم لا. القيمة الافتراضية هي <code>true</code>.
+
* <code>isInteraction</code>: تُحدِّد ما إذا كان التأثير الحركي سيُنشئ مُتحكِّمًا تفاعليًا (interaction handle) في <code>interacionManager</code>أم لا، والقيمة الافتراضية هي <code>true</code>.
* <code>useNativeDriver</code>: تستخدم برنامج التشغيل الأصلي عندما تكون قيمتها <code>true</code>. القيمة الافتراضية هي <code>false</code>.
+
* <code>useNativeDriver</code>: تستخدم برنامج التشغيل الأصلي عندما تكون قيمتها <code>true</code>، القيمة الافتراضية هي <code>false</code>.
  
 
=== <code>timing</code> ===
 
=== <code>timing</code> ===
  
<syntaxhighlight class="react">static timing(value, config)</syntaxhighlight>
+
<syntaxhighlight class="react" lang="javascript">static timing(value, config)</syntaxhighlight>
تُحرك قيمة على منحنى معين. تحتوي وِحدة التسارع على العديد من المنحنيات المُعرفَّة مسبقًا، ويمكنك أيضًا تعريف منحنيات جديدة باستخدام دوال معينة.
+
تُحرك قيمة على منحنى معيّن، تحتوي وِحدة التسارع على العديد من المنحنيات المُعرفَّة مسبقًا، ويمكنك أيضًا تعريف منحنيات جديدة باستخدام دوال معيّنة.
  
 
يحتوي الكائن <code>config</code> على خيارات التحريك وهي:
 
يحتوي الكائن <code>config</code> على خيارات التحريك وهي:
  
* <code>duration</code>: تُحدد المدة الزمنية (بالملي ثانية) التي يستغرقها التأثير الحركي للوصول لنقطة النهاية. القيمة الافتراضية هي 500.
+
* <code>duration</code>: تُحدّد المدة الزمنية (بالملي ثانية) التي يستغرقها التأثير الحركي للوصول لنقطة النهاية، والقيمة الافتراضية لها هي 500.
* <code>easing</code>: تُحدد دالة التسارع التي بدورها تُعرِّف منحى التأثير الحركي. القيمة الافتراضية هي <code>Easing.inOut(Easing.ease)</code>.
+
* <code>easing</code>: تُحدّد دالة التسارع التي بدورها تُعرِّف منحى التأثير الحركي. القيمة الافتراضية هي <code>(Easing.inOut(Easing.ease</code>.
* <code>delay</code>: تؤخر بدء التأثير الحركي بمقدار زمني محدد. القيمة الافتراضية هي صفر.
+
* <code>delay</code>: تؤخّر بدء التأثير الحركي بمقدار زمني محدد. القيمة الافتراضية هي صفر.
* <code>isInteraction</code>: تُحدد ما إذا كان التأثير الحركي سيُنشئ مُتحكِّم تفاعلي (interaction handle) في <code>interacionManager</code>أم لا. القيمة الافتراضية هي <code>true</code>.
+
* <code>isInteraction</code>: تُحدد ما إذا كان التأثير الحركي سيُنشئ مُتحكِّم تفاعلي (interaction handle) في <code>interacionManager</code>أم لا، والقيمة الافتراضية هي <code>true</code>.
* <code>useNativeDriver</code>: تستخدم برنامج التشغيل الأصلي عندما تكون قيمتها <code>true</code>. القيمة الافتراضية هي <code>false</code>.
+
* <code>useNativeDriver</code>: تُستخدم برنامج التشغيل الأصلي عندما تكون قيمتها <code>true</code>. القيمة الافتراضية هي <code>false</code>.
  
 
=== <code>spring</code> ===
 
=== <code>spring</code> ===
  
<syntaxhighlight class="react">static spring(value, config)</syntaxhighlight>
+
<syntaxhighlight class="react" lang="javascript">static spring(value, config)</syntaxhighlight>
 
يُحرِّك القيمة وفقًأ لنموذج النابض القائم على الحركة التذبذبية التوافقية.  
 
يُحرِّك القيمة وفقًأ لنموذج النابض القائم على الحركة التذبذبية التوافقية.  
  
 
'''ملاحظة''' يمكنك تعريف واحد فقط من الخيارات التالية: <code>bounciness/speed</code>أو <code>tension/friction</code> أو <code>stiffness/damping/mass</code>.
 
'''ملاحظة''' يمكنك تعريف واحد فقط من الخيارات التالية: <code>bounciness/speed</code>أو <code>tension/friction</code> أو <code>stiffness/damping/mass</code>.
  
تُطابق <code>friction/tension</code> و <code>bounciness/speed</code> خيارات نموذج النابض الخاص [https://github.com/facebook/pop بفيسبوك] و [http://facebook.github.io/rebound/ Rebound] و [http://origami.design/ Origami].
+
تُطابق <code>friction/tension</code> و<code>bounciness/speed</code> خيارات نموذج النابض الخاص [https://github.com/facebook/pop بفيسبوك] و[http://facebook.github.io/rebound/ Rebound] و[http://origami.design/ Origami].
  
* <code>friction</code>: يتحكم في النسبة <code>bounciness/overshoot</code>. القيمة الافتراضية هي 7.
+
* <code>friction</code>: يتحكم في النسبة <code>bounciness/overshoot</code>، والقيمة الافتراضية هي 7.
* <code>tension</code>: يتحكم في السرعة. القيمة الافتراضية هي 40.
+
* <code>tension</code>: يتحكم في السرعة، والقيمة الافتراضية هي 40.
* speed`: يتحكم في سرعة التأثير الحركي. القيمة الافتراضية هي 12.
+
* <code>speed</code>: يتحكم في سرعة التأثير الحركي، والقيمة الافتراضية هي 12.
* bounciness`: يتحكم في القفزات. القيمة الافتراضية هي 8.
+
* <code>bounciness</code>: يتحكم في القفزات، والقيمة الافتراضية هي 8.
  
تحديد المعاملات <code>stiffness/damping/mass</code> يجعل <code>Animated.spring</code>تستخدم نموذج نابض تحليلي يعتمد على معاطلات [https://en.wikipedia.org/wiki/Harmonic_oscillator#Damped_harmonic_oscillator الحركة التذبذبية التوافقية]. هذا الاسلوب يستعمل قوانين الفيزياء ويُحاكي تطبيق <code>CASpringAnimation</code> على نظام iOS.
+
تحديد المعاملات <code>stiffness/damping/mass</code> يجعل <code>Animated.spring</code> تستخدم نموذج نابض تحليلي يعتمد على معاطلات [https://en.wikipedia.org/wiki/Harmonic_oscillator#Damped_harmonic_oscillator الحركة التذبذبية التوافقية] (damped harmonic oscillator). هذا الأسلوب يستعمل قوانين الفيزياء ويُحاكي تطبيق <code>CASpringAnimation</code> على نظام iOS.
  
* <code>stiffness</code>: يُحدد معامل صلابة النابض. القيمة الافتراضية هي 100.
+
* <code>stiffness</code>: يُحدد معامل صلابة النابض، والقيمة الافتراضية هي 100.
* <code>damping</code>: يُحدد كيف تتباطأ سُرعة حركة النابض بسبب قوى الاحتكاك. القيمة الافتراضية هي 10.
+
* <code>damping</code>: يُحدد كيف تتباطأ سُرعة حركة النابض بسبب قوى الاحتكاك، والقيمة الافتراضية هي 10.
* <code>mass</code>: تُحدد كتلة الجسم المُعَلَّق على النابض. القيمة الافتراضية هي 1.
+
* <code>mass</code>: تُحدد كتلة الجسم المُعَلَّق على النابض، والقيمة الافتراضية هي 1.
  
'''معاملات اضافية'''
+
'''معاملات اضافية:'''
  
* <code>velocity</code>: السرعة الابتدائية للجسم المعلق على النابض. القيمة الافتراضية هي صفر.
+
* <code>velocity</code>: السرعة الابتدائية للجسم المعلَّق على النابض. القيمة الافتراضية هي صفر.
 
* <code>overshootClamping</code>: قيمة منطقية تشير إلى ما إذا كان ينبغي تثبيت النابض وإيقاف الارتداد. القيمة الافتراضية هي <code>false</code>.
 
* <code>overshootClamping</code>: قيمة منطقية تشير إلى ما إذا كان ينبغي تثبيت النابض وإيقاف الارتداد. القيمة الافتراضية هي <code>false</code>.
 
* <code>restDisplacementThreshold</code> : يحدد قيمة عتبة الإزاحة من السكون والتي يجب اعتبار النابض تحتها في حالة سكون (عدم حركة). القيمة الافتراضية هي 0.001.
 
* <code>restDisplacementThreshold</code> : يحدد قيمة عتبة الإزاحة من السكون والتي يجب اعتبار النابض تحتها في حالة سكون (عدم حركة). القيمة الافتراضية هي 0.001.
* <code>restSpeedThreshold</code>: يحدد السرعة التي يعتبر عندها النابض في حالة سكون، وتقاس بوحدات البكسل في الثانية. القيمة الافتراضية هي 0.001.
+
* <code>restSpeedThreshold</code>: يحدد السرعة التي يعتبر عندها النابض في حالة سكون، وتقاس بوحدات البكسل في الثانية، أمّا القيمة الافتراضية فهي 0.001.
* <code>delay</code>: تؤخر بدء التأثير الحركي بمقدار زمني محدد. القيمة الافتراضية هي صفر.
+
* <code>delay</code>: تؤخر بدء التأثير الحركي بمقدار زمني محدد، والقيمة الافتراضية هي الصفر.
 
* <code>isInteraction</code>: تُحدد ما إذا كان التأثير الحركي سيُنشئ مُتحكِّم تفاعلي (interaction handle) في <code>interacionManager</code>أم لا. القيمة الافتراضية هي <code>true</code>.
 
* <code>isInteraction</code>: تُحدد ما إذا كان التأثير الحركي سيُنشئ مُتحكِّم تفاعلي (interaction handle) في <code>interacionManager</code>أم لا. القيمة الافتراضية هي <code>true</code>.
 
* <code>useNativeDriver</code>: تستخدم برنامج التشغيل الأصلي عندما تكون قيمتها <code>true</code>. القيمة الافتراضية هي <code>false</code>.
 
* <code>useNativeDriver</code>: تستخدم برنامج التشغيل الأصلي عندما تكون قيمتها <code>true</code>. القيمة الافتراضية هي <code>false</code>.
  
=== <code>add()</code> ===
+
=== <code>add()</code> ===
 
 
 
تُنشئ تأثير حركي جديد ناتج عن دمج تأثيرين حركيين مع بعضهما البعض.
 
تُنشئ تأثير حركي جديد ناتج عن دمج تأثيرين حركيين مع بعضهما البعض.
  
<syntaxhighlight class="react">static add(a,b)</syntaxhighlight>
+
<syntaxhighlight class="react" lang="javascript">static add(a,b)</syntaxhighlight>
 
 
  
 
=== <code>substract</code> ===
 
=== <code>substract</code> ===
سطر 330: سطر 307:
 
تُنشئ تأثير حركي جديد عن طريق طرح التأثير الحركي الثاني من التأثير الحركي الأول.
 
تُنشئ تأثير حركي جديد عن طريق طرح التأثير الحركي الثاني من التأثير الحركي الأول.
  
<syntaxhighlight class="react">static subtract(a,b)</syntaxhighlight>
+
<syntaxhighlight class="react" lang="javascript">static subtract(a,b)</syntaxhighlight>
 
+
=== <code>divide()</code> ===
 
 
=== <code>divide()</code> ===
 
 
 
 
تُنشئ تأثير حركي جديد عن طريق قسمة التأثير الحركي الأول على التأثير الحركي الثاني.
 
تُنشئ تأثير حركي جديد عن طريق قسمة التأثير الحركي الأول على التأثير الحركي الثاني.
  
<syntaxhighlight class="react">static divide(a,b)</syntaxhighlight>
+
<syntaxhighlight class="react" lang="javascript">static divide(a,b)</syntaxhighlight>
 
 
  
=== <code>multiply()</code> ===
+
=== <code>multiply()</code> ===
  
 
تُنشئ تأثير حركي جديد عن طريق ضرب التأثير الحركي الأول في التأثير الحركي الثاني.
 
تُنشئ تأثير حركي جديد عن طريق ضرب التأثير الحركي الأول في التأثير الحركي الثاني.
  
<syntaxhighlight class="react">static multiply(a,b)</syntaxhighlight>
+
<syntaxhighlight class="react" lang="javascript">static multiply(a,b)</syntaxhighlight>
  
 
+
=== <code>modulo()</code> ===
=== <code>modulo()</code> ===
 
  
 
تُنشئ تأثير حركي جديد عن طريق أخذ باقي قسمة التأثير الحركي الأول على التأثير الحركي الثاني.
 
تُنشئ تأثير حركي جديد عن طريق أخذ باقي قسمة التأثير الحركي الأول على التأثير الحركي الثاني.
  
<syntaxhighlight class="react">static modulo(a,b)</syntaxhighlight>
+
<syntaxhighlight class="react" lang="javascript">static modulo(a,b)</syntaxhighlight>
 
 
  
 
=== <code>diffClamp</code> ===
 
=== <code>diffClamp</code> ===
  
تُنشئ قيمة متحركة جديدة محدودة بين قيمتين. يستخدم الفرق بين القيمة الأخيرة، لذلك حتى إذا كانت القيمة بعيدة عن الحدود فستبدأ في التغيير عندما تبدأ القيمة في الاقتراب مرة أخرى.
+
تُنشئ قيمةً متحركةً جديدةً محدودة بين قيمتين، ويُستخدم الفرق بين القيمة الأخيرة، لذلك فحتى إذا كانت القيمة بعيدةً عن الحدود فستبدأ في التغيير عندما تبدأ القيمة في الاقتراب مرّةً أخرى (<code>value = clamp(value + diff, min, max)</code>).
  
هذا مفيد مع أحداث التمرير، على سبيل المثال لإظهار شريط التنقل عند التمرير لأعلى وإخفاءه عند التمرير لأسفل.
+
هذا مفيد مع أحداث التمرير، فلإظهار شريط التنقل عند التمرير لأعلى مثلًا وإخفاءه عند التمرير لأسفل، نستخدم ما يلي:
  
<syntaxhighlight class="react">static diffClamp(a, min, max)</syntaxhighlight>
+
<syntaxhighlight class="react" lang="javascript">static diffClamp(a, min, max)</syntaxhighlight>
 +
=== <code>delay()‎</code> ===
  
 +
تؤخّر بدء التأثير الحركي بمقدار زمني محدَّد.
  
=== <code>delay()</code> ===
+
<syntaxhighlight class="react" lang="javascript">static delay(time)</syntaxhighlight>
  
تؤخر بدء التأثير الحركي بمقدار زمني محدد.
+
=== <code>sequence()‎</code> ===
  
<syntaxhighlight class="react">static delay(time)</syntaxhighlight>
+
تُنفذ عددًا من التأثيرات الحركية متتابعةً الواحدة تلو الآخرى.
  
 +
<syntaxhighlight class="react" lang="javascript">static sequence(animations)</syntaxhighlight>
  
=== <code>sequence()</code> ===
+
=== <code>parallel()</code> ===
  
تُنفذ عدد من التأثيرات الحركية بشكل متتابع الواحد تلو الآخر.
+
تنفذ عددًا من التأثيرات الحركية (مصفوفة من الحركات) في نفس الوقت متوازيةً، وعند توقف تأثير حركي واحد افتراضيًا فستتوقف جميع التأثيرات الحركية الأخرى، ويمكن تجاوز هذا السلوك باستخدام المُعرِّف <code>stopTogether</code>.
  
<syntaxhighlight class="react">static sequence(animations)</syntaxhighlight>
+
<syntaxhighlight class="react" lang="javascript">static parallel(animations, config?)</syntaxhighlight>
  
 +
=== <code>stagger()‎</code> ===
  
=== <code>parallel()</code> ===
+
مصفوفة من التأثيرات الحركية تنفذ متوازيةً (متداخلة)، ولكنها تبدأ تسلسليًا بتأخيرات معيّنة مناسبة لعمل تأثيرات زائدة.
  
تنفذ عددًا من التأثيرات الحركية (مصفوفة من الحركات) في نفس الوقت بشكل متوازي. بشكل افتراضي فإنًَه عند توقف تأثير حركي واحد تتوقف جميع التأثيرات الحركية الأخرى. ويمكن تجاوز هذا السلوك باستخدام المُعرِّف <code>stopTogether</code>.
+
=== <code>loop()‎</code> ===
  
<syntaxhighlight class="react">static parallel(animations, config?)</syntaxhighlight>
+
تُكرر التأثيرات الحركية باستمرار، إذ يحدث التكرار دون حظر سلسلة جافا سكريبت، وفي حال كانت قيمة الخاصية <code>useNativeDriver</code> هي <code>true</code>.
  
 +
من الممكن منع الحلقات للمكونات المبنية على المكون <code>VirtualizedList</code> من عرض المزيد من الصفوف أثناء تشغيل التأثير الحركي، ويمكن إصلاح هذا عن طريق إعطاء الخاصية <code>isInteraction</code>  القيمةَ <code>false</code>.
  
=== <code>stagger()</code> ===
+
* <code>iterations</code>: عدد مرات تكرار التأثيرات الحركية، والقيمة الافتراضية هي -1 وتعني إعادة التكرار إلى ما لا نهاية.
  
مصفوفة من التأثيرات الحركية تنفذ بشكل متوازي (متداخلة)، ولكنها تبدأ بشكل تسلسلي بتأخيرات معينة. مناسبة لعمل تأثيرات زائدة.
+
=== <code>event()‎</code> ===
  
 +
<syntaxhighlight class="react" lang="javascript">static event(argMapping, config?)</syntaxhighlight>
 +
تأخذ مصفوفة بيانات وتستخرج قيم التأثيرات الحركية من هذه البيانات. ثم تستدعى الدالة <code>setValue</code>على المخرجات المعيّنة.
  
 +
'''مثال'''
  
=== <code>loop()</code> ===
+
<syntaxhighlight class="react" lang="javascript"> onScroll={Animated.event(
 
 
تُكرر التأثيرات الحركية بشكل مستمر. يحدث التكرار دون حظر سلسلة جافا سكريبت في حال كانت قيمة الخاصية <code>useNativeDriver</code> هي <code>true</code>.
 
 
 
من الممكن أن تمنع الحلقات المكونات المبنية على المكون <code>VirtualizedList</code> من عرض المزيد من الصفوف أثناء تشغيل التأثير الحركي، ويمكن إصلاح هذا عن طريق إعطاء الخاصية <code>isInteraction</code> القيمة <code>false</code>.
 
 
 
* <code>iterations</code>: عدد مرات تكرار التأثيرات الحركية. القيمة الافتراضية هي -1 وتعني إعادة التكرار إلى ما لا نهاية.
 
 
 
=== <code>event()</code> ===
 
 
 
<syntaxhighlight class="react">static event(argMapping, config?)</syntaxhighlight>
 
تأخذ مصفوفة بيانات وتستخرج قيم التأثيرات الحركية من هذه البيانات. ثم تستدعى الدالة <code>setValue</code>على المخرجات المعينة.
 
 
 
'''*مثال'''
 
 
 
<syntaxhighlight class="react"> onScroll={Animated.event(
 
 
   [{nativeEvent: {contentOffset: {x: this._scrollX}}}],
 
   [{nativeEvent: {contentOffset: {x: this._scrollX}}}],
 
   {listener: (event) => console.log(event)}, // Optional async listener
 
   {listener: (event) => console.log(event)}, // Optional async listener
سطر 418: سطر 382:
  
 
* <code>listener</code>: (اختياري) مستمع غير متزامن.
 
* <code>listener</code>: (اختياري) مستمع غير متزامن.
* useNativeDriver<code>: تستخدم برنامج التشغيل الأصلي عندما تكون قيمتها</code>true<code>. القيمة الإفتراضية هي</code>false`.
+
* <code>useNativeDriver:</code> تستخدم برنامج التشغيل الأصلي عندما تكون قيمتها <code>true</code>، والقيمة الإفتراضية هي<code>false</code>.
 
 
  
 +
=== <code>forkEvent()‎</code> ===
  
=== <code>forkEvent()</code> ===
+
<syntaxhighlight class="react" lang="javascript">static forkEvent(event, listener)</syntaxhighlight>
 +
واجهة برمجية حديثة لمراقبة الأحداث المتحركة التي تُمرّر في صورة معاملات، حيث تسمح بإضافة مستمع جديد إلى المستمع <code>AnimatedEvent</code> الموجود مسبقًا، فإذا كان <code>animatedEvent</code> مستمعًا لجافا سكريبت فسيدمج المستعمان معًا في مستمع واحد؛ أمّا إذا كان <code>animatedEvent</code> خالي (أي قيمته <code>null</code> أو <code>undefined</code>)، فسيُعيَّن مستمع جافا سكريبت مباشرةً. تستخدم القيم مباشرةً إذا كان ذلك ممكنًا.
  
<syntaxhighlight class="react">static forkEvent(event, listener)</syntaxhighlight>
+
=== <code>unforkEvent()</code> ===
واجهة برمجية حديثة لمراقبة الأحداث المتحركة التي يتم تمريرها كمعاملات. تسمح بإضافة مستمع جديد إلى المستمع <code>AnimatedEvent</code> الموجود مسبقًا. إذا كان <code>animatedEvent</code> مستمعًا لجافا سكريبت سيدمج المستعمان معًا في مستمع واحد، وإذا كان <code>animatedEvent</code> خالي (أي قيمته null أو undefined)، يُعيَّن مستمع جافا سكريبت مباشرةً. تستخدم القيم مباشرةً إذا كان ذلك ممكنًا.
 
  
 +
<syntaxhighlight class="react" lang="javascript">static unforkEvent(event, listener)</syntaxhighlight>
  
 +
=== <code>start()‎</code> ===
  
=== <code>unforkEvent()</code> ===
+
<syntaxhighlight class="react" lang="javascript">static start([callback]: ?(result?: {finished: boolean}) => void)</syntaxhighlight>
 +
تبدأ التأثيرات الحركية عندما تُستدعى الدالة <code>()start</code>، والتي بدورها تأخذ دالة أخرى تُستدعى عند إيقاف التأثير الحركي عن طريق الدالة <code>()stop</code>.
  
<syntaxhighlight class="react">static unforkEvent(event, listener)</syntaxhighlight>
+
{| class="wikitable"
 
 
 
 
=== <code>start()</code> ===
 
 
 
<syntaxhighlight class="react">static start([callback]: ?(result?: {finished: boolean}) => void)</syntaxhighlight>
 
تبدأ التأثيرات الحركية عندما يتم استدعاء الدالة <code>start()</code>، والتي بدورها تأخذ دالة أخرى تُستدعى عند إيقاف التأثير الحركي عن طريق الدالة <code>stop()</code>.
 
 
 
{|
 
 
! الاسم
 
! الاسم
 
! النوع
 
! النوع
سطر 446: سطر 405:
 
|-
 
|-
 
| callback
 
| callback
| ?(result?: {finished: boolean})
+
| ({result?: {finished: boolean)?
 
| لا
 
| لا
| دالة تُستدعى عندما يتم إيقاف التأثير الحركي باستخدام الدالة <code>stop</code>أو عن انتهائه.
+
| تُستدعى الدالة عندما يوقّف التأثير الحركي باستخدام الدالة <code>stop</code> أو عن انتهائه.
 
|}
 
|}
  
'''مثال'''
+
إليك مثال مع دالة رد نداء:
  
<syntaxhighlight class="react">Animated.timing({}).start(({ finished }) => {
+
<syntaxhighlight class="react" lang="javascript">Animated.timing({}).start(({ finished }) => {
 
   /* completion callback */
 
   /* completion callback */
 
});</syntaxhighlight>
 
});</syntaxhighlight>
  
 +
=== <code>stop()‎</code> ===
  
=== <code>stop()</code> ===
+
<syntaxhighlight class="react" lang="javascript">static stop()</syntaxhighlight>
 
 
<syntaxhighlight class="react">static stop()</syntaxhighlight>
 
 
توقف جميع التأثيرات الحركية قيد التنفيذ.
 
توقف جميع التأثيرات الحركية قيد التنفيذ.
  
 +
=== <code>reset()‎</code> ===
  
 
+
<syntaxhighlight class="react" lang="javascript">static reset()</syntaxhighlight>
=== <code>reset()</code> ===
 
 
 
<syntaxhighlight class="react">static reset()</syntaxhighlight>
 
 
توقف جميع التأثيرات الحركية قيد التنفيذ وتعيد قيمتها للقيمة الابتدائية.
 
توقف جميع التأثيرات الحركية قيد التنفيذ وتعيد قيمتها للقيمة الابتدائية.
  
 
+
== الخاصيات ==
 
 
== مرجع الخاصيّات ==
 
  
 
=== <code>value</code> ===
 
=== <code>value</code> ===
  
القيمة الأساسية للتأثيرات الحركية، وعادة ما تأخذ القيمة <code>صفر</code> في البداية.
+
القيمة الأساسية للتأثيرات الحركية، وعادةً ما تأخذ القيمة صفر في البداية أي <code>new Animated.Value(0);‎</code>.
  
<code>new Animated.Value(0)</code>
+
انظر صفحة [[ReactNative/animatedvalue|المتغير <code>Animated.Value</code>]] لمزيد من المعلومات.
 
+
=== <code>valueXY</code> ===
[https://reactnative.dev/docs/animatedvalue مزيد من المعلومات حول <code>Animated.Value</code>.]
 
 
 
 
 
 
 
=== <code>valueXY()</code> ===
 
  
 
كائن ثُنائي الابعاد يستخدم لإنشاء التأثيرات الحركية ثنائية الابعاد.  
 
كائن ثُنائي الابعاد يستخدم لإنشاء التأثيرات الحركية ثنائية الابعاد.  
  
[https://reactnative.dev/docs/animatedvaluexy مزيد من المعلومات حول <code>Animated.ValueXY</code>.]
+
انظر صفحة [[ReactNative/animatedvaluexy|المتغير <code>Animated.ValueXY</code>]] لمزيد من المعلومات.
 
 
 
 
 
 
 
=== <code>Interpolation</code> ===
 
=== <code>Interpolation</code> ===
  
تم تصديرها لاستخدام أنواع الاستيفاء في التدفق
+
صُدّرت لاستخدام أنواع الاستيفاء في التدفق
 
 
 
 
 
 
 
=== <code>Node</code> ===
 
=== <code>Node</code> ===
  
 
جميع القيم المتحركة مشتقة من هذا الصنف، وذلك لسهولة فحص أنواع البيانات عليه.
 
جميع القيم المتحركة مشتقة من هذا الصنف، وذلك لسهولة فحص أنواع البيانات عليه.
 
 
 
 
=== <code>createAnimatedComponent</code> ===
 
=== <code>createAnimatedComponent</code> ===
  
 
تستخدم لجعل المكونات قابلة للتحريك.
 
تستخدم لجعل المكونات قابلة للتحريك.
 
 
 
 
=== <code>attachNativeEvent</code> ===
 
=== <code>attachNativeEvent</code> ===
  
سطر 518: سطر 455:
 
[https://reactnative.dev/docs/animated صفحة Animated في توثيق React Native الرسمي].
 
[https://reactnative.dev/docs/animated صفحة Animated في توثيق React Native الرسمي].
 
[[تصنيف:ReactNative]]
 
[[تصنيف:ReactNative]]
 +
[[تصنيف:React Native API]]

المراجعة الحالية بتاريخ 14:12، 9 أكتوبر 2021

صُمِّمَت واجهة ‎Animated‎ البرمجيّة لتسهيل التعبير عن مجموعة متنوعة من أنماط التحريك والتفاعل بطريقة فائقة الأداء. تركّز واجهة ‎Animated‎ على العلاقات التعريفية بين المدخلات (inputs) والمخرجات (outputs)، مع وجود تحويلات قابلة للضّبط بينهما، إضافة إلى تابعَي ‎start‎ و‎stop‎ بسيطين للتحكم في تنفيذ التّحريك على أساس الوقت.

لإنشاء تأثير حركي عليك أولًا البدء بإنشاء متغيّر Animated.Value وربطه بواحدة أو أكثر من أنماط المكون المتحركة ودفع التحديثات عبر التأثيرات الحركية باستخدام الدالة ()Animated.timing.

مثال

إليك المثال التالي الذي تحوي المكون View والذي سيظهر ويختفي بتأثير التلاشي بناء على قيمة fadeAnim.

استخدام مكون دالة (Function component)

عند استخدام المكونات الدالِّية لإنشاء التأثيرات الحركية يجب عدم تعديل قيمة animmated.value مباشرةً، وإنما يجب استخدام الخطاف useRef لإرجاع كائن مرجعي قابل للتعديل، وتُهيّئ الخاصية current للكائن ref على أنّها المعاملات المبدئية، وتستمر طوال دورة حياة المكون.

إليك المثال (تجربة حية):

import React, { useRef } from "react";
import { Animated, Text, View, StyleSheet, Button, SafeAreaView } from "react-native";

const App = () => {
  // fadeAnim will be used as the value for opacity. Initial Value: 0
  const fadeAnim = useRef(new Animated.Value(0)).current;

  const fadeIn = () => {
    // Will change fadeAnim value to 1 in 5 seconds
    Animated.timing(fadeAnim, {
      toValue: 1,
      duration: 5000
    }).start();
  };

  const fadeOut = () => {
    // Will change fadeAnim value to 0 in 3 seconds
    Animated.timing(fadeAnim, {
      toValue: 0,
      duration: 3000
    }).start();
  };

  return (
    <SafeAreaView style={styles.container}>
      <Animated.View
        style={[
          styles.fadingContainer,
          {
            // Bind opacity to animated value
            opacity: fadeAnim
          }
        ]}
      >
        <Text style={styles.fadingText}>Fading View!</Text>
      </Animated.View>
      <View style={styles.buttonRow}>
        <Button title="Fade In View" onPress={fadeIn} />
        <Button title="Fade Out View" onPress={fadeOut} />
      </View>
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: "center",
    justifyContent: "center"
  },
  fadingContainer: {
    padding: 20,
    backgroundColor: "powderblue"
  },
  fadingText: {
    fontSize: 28
  },
  buttonRow: {
    flexBasis: 100,
    justifyContent: "space-evenly",
    marginVertical: 16
  }
});

export default App;

استخدام مكون صنف (Class component)

عند استخدام مكون صنفي لإنشاء التأثيرات الحركية يجب عدم تعديل قيمة animmated.value مباشرةً، وإنما يجب تخزينها في صورة متغيّر في الحالة الخاصة بالمكون state.

إليك المثال (تجربة حية):

import React, { Component } from "react";
import { Animated, Text, View, StyleSheet, Button, SafeAreaView } from "react-native";

class App extends Component {
  // fadeAnim will be used as the value for opacity. Initial Value: 0
  state = {
    fadeAnim: new Animated.Value(0)
  };

  fadeIn = () => {
    // Will change fadeAnim value to 1 in 5 seconds
    Animated.timing(this.state.fadeAnim, {
      toValue: 1,
      duration: 5000
    }).start();
  };

  fadeOut = () => {
    // Will change fadeAnim value to 0 in 3 seconds
    Animated.timing(this.state.fadeAnim, {
      toValue: 0,
      duration: 3000
    }).start();
  };

  render() {
    return (
      <SafeAreaView style={styles.container}>
        <Animated.View
          style={[
            styles.fadingContainer,
            {
              // Bind opacity to animated value
              opacity: this.state.fadeAnim
            }
          ]}
        >
          <Text style={styles.fadingText}>Fading View!</Text>
        </Animated.View>
        <View style={styles.buttonRow}>
          <Button title="Fade In View" onPress={this.fadeIn} />
          <Button title="Fade Out View" onPress={this.fadeOut} />
        </View>
      </SafeAreaView>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: "center",
    justifyContent: "center"
  },
  fadingContainer: {
    padding: 20,
    backgroundColor: "powderblue"
  },
  fadingText: {
    fontSize: 28
  },
  buttonRow: {
    flexBasis: 100,
    justifyContent: "space-evenly",
    marginVertical: 16
  }
});

export default App;

ارجع إلى دليل التأثيرات الحركية لمزيد من الأمثلة.

نظرة عامة

هناك نوعان من البيانات يمكن استخدامهم مع المكون Animated هما:

  • ()Animated.Value: للقيم المُفردة.
  • ()Animated.ValueXY: للمُتجهات.

قد ترتبط Animated.Value بخصائص النمط أو الخواص الأخرى، كما قد تؤدّي قيمة Animated.Value واحدة العديد من الخصائص.

إنشاء وضبط التأثيرات الحركية

يوفر المكون Animated ثلاثة أنواع من التأثيرات الحركية يُمثّل كلٌّ منها منحنى حركة معيّن يتحكم في معدَّل تغير قيمة التأثير الحركي من القيمة الأولية إلى القيمة النهائية.

  • ()Animated.decay: يبدأ بسرعة أولية و يتباطأ تدريجيًا حتى يتوقف.
  • Animated.spring: تُمثل نموذجًا أساسيًا لفيزياء النوابض.
  • Animated.timing: يُغيِّر قيمة التأثير الحركي مع مرور الزمن باستخدام دوال التسارع (easing functions).

في أغلب الأحيان تُستعمل الدالة ()timing، والتي تستخدم منحنى easeInOut إفتراضيًّا. هذا المنحنى يمثل التسارع التدريجي لجسمٍ ما إلى أقصى سرعة ثم التباطؤ تدريجيًأ حتى التوقف.

التعامل مع التأثيرات الحركية

تبدأ التأثيرات الحركية عن طريق استدعاء الدالة ()start على التأثير الحركي. تأخذ الدالة start رد نداء (callback) يُستدعى عند انتهاء التأثير الحركي، حيثُ تكون قيمة المعامل finished فيه هي true إذا اكتمل التأثير الحركي بنجاح وحينها يتم استدعاء دالة إيقاف التأثير الحركي stop، وتكون قيمته false فيما عدا ذلك.

Animated.timing({}).start(({ finished }) => {
  /* completion callback */
});

استخدام برامج التشغيل الأصلية

المُشغِّل الأصلي (Native driver) يُحوِّل جميع المعلومات الخاصة بالتأثير الحركي المُراد إنشاءه إلى شيفرة أصلية (Native Code) قبل بدء التنفيذ، مما يسمج للشيفرة الأصلية بتنفيذ التأثيرات على واجهة المستخدم مباشرة دون المرور بالجسر الذي يربط بين شيفرة React Native والشيفرة الأصلية.

يمكن تفعيل استخدام المشغلات الأصلية من خلال إعطاء الخاصية useNativeDriver القيمة true. لمزيد من المعلومات انظر دليل التأثيرات الحركية.

المكونات القابلة للتحريك

يمكن تطبيق التأثيرات الحركية على المكونات القابلة للتحريك فقط، حيث تستطيع هذه المكونات الربط بين القيم المختلفة للخصائص والانتقال بينها بطريقة سلسة عن طريق عمل تحديثات بسيطة للمكون في كلّ مرّة لتجنب إعادة رسمه بالكامل. وكذلك لديهم القابلية لتنفيذ عمليات التنظيف عند حذف المكون من شاشة العرض.

تُستخدم الدالة ()createAnimatedComponent لإنشاء مكوّنات قابلة للتحريك.

يشمل المكون Animated المكونات التالية:

  • Animated.Image
  • Animated.ScrollView
  • Animated.Text
  • Animated.View
  • Animated.FlatList
  • Animated.SectionList

تركيب التأثيرات الحركية

يُمكن تركيب التأثيرات الحركية المختلفة لإنشاء تأثيرات أكثر تعقيدًا عن طريق استخدام دوال الدمج.

  • ()nimated.delay: تؤخِّر بدء تنفيذ التحريك بمقدار زمنيّ معيّن.
  • ()Animated.parallel: تبدأ تنفيذ عدد من التأثيرات الحركية في نفس الوقت.
  • ()Animated.squence: تُنفِّذ التأثيرات الحركية واحدًا تلوَ الآخر بالتسلسل.
  • ()Animated.stagger: تبدأ التأثيرات الحركية متوازيةً ومتسلسلة، ولكن مع تأخيرات متتالية.

ويمكن أيضًأ ربط التأثيرات الحركية ببعضها البعض عن طريق تعيين قيمة الخاصية toValue لأحد التأثيرات لتكوّن Animated.Value. انظر تتبع القيم في دليل التأثيرات الحركية.

دمج التأثيرات الحركية

يمكن دمج التأثيرات الحركية عن طريق عمليات الجمع، والطرح، والضرب، والقسمة، وباقي القسمة للحصول على تأثيرات حركية جديدة.

  • ()Animated.add
  • ()Animated.subtract
  • ()Animated.divide
  • ()Animated.modulo
  • ()Animated.multiply

الاستيفاء

تُستخدم الدالة interpolate لتحديد مدى معيّن للمُدخلات للحصول على مُخرجات في مدى معيّن آخر. حيث تقرأ افتراضيًّا المنحنى خارج المدى المحدَّد، ولكن يمكنك جعله يثبّت قيمة المخرجات. تستخدم الدالة الاستيفاء الخطي افتراضيًّأ ولكنها تدعم جميع وظائف التحريك (easing functions).

انظر دليل التأثيرات الحركية.

التعامل مع الإيماءات والأحداث الأخرى

يمكن تحديد قيم للإيماءات، مثل التحريك أو التمرير، والأحداث الأخرى باستخدام الدالة ()Animated.event ، حيث تُستخدم بنية الخريطة الهيكلية لاستخراج القيم من الكائنات المعقدة.

المستوى الأول عبارة عن مصفوفة تسمح باستخراج البيانات عبر العديد من الوسائط، وتحتوي هذه المجموعة على كائنات متداخلة.

عند التعامل مع إيماءات التمرير الأفقي على سبيل المثال، يمكنك القيام بما يلي من أجل تعيين event.nativeEvent.contentOffset.x إلى scrollY.

 onScroll={Animated.event(
   // scrollX = e.nativeEvent.contentOffset.x
   [{ nativeEvent: {
        contentOffset: {
          x: scrollX
        }
      }
    }]
 )}

التوابع

ملاحظة عندما استخدام ValueXY بدلًا عن Value لاستقبال المُدخلات، فستُصبح خيارات الضبط (Config options) مجموعة متجهات (vectors) من الشكل {x: ..., y: ...‎} بدلًا عن قيم قياسية (أرقام).

decay()‎

static decay(value, config)

تُحرك قيمة معيّنة من السرعة الإبتدائية إلى الصفر بمعدَّل معيّن.

يحتوي الكائن config على خيارات التحريك وهي:

  • velocity: (مطلوب) ويمثل السرعة الإبتدائية.
  • deceleration: معدَّل التباطؤ، والقيمة الافتراضية هي 0.997.
  • isInteraction: تُحدِّد ما إذا كان التأثير الحركي سيُنشئ مُتحكِّمًا تفاعليًا (interaction handle) في interacionManagerأم لا، والقيمة الافتراضية هي true.
  • useNativeDriver: تستخدم برنامج التشغيل الأصلي عندما تكون قيمتها true، القيمة الافتراضية هي false.

timing

static timing(value, config)

تُحرك قيمة على منحنى معيّن، تحتوي وِحدة التسارع على العديد من المنحنيات المُعرفَّة مسبقًا، ويمكنك أيضًا تعريف منحنيات جديدة باستخدام دوال معيّنة.

يحتوي الكائن config على خيارات التحريك وهي:

  • duration: تُحدّد المدة الزمنية (بالملي ثانية) التي يستغرقها التأثير الحركي للوصول لنقطة النهاية، والقيمة الافتراضية لها هي 500.
  • easing: تُحدّد دالة التسارع التي بدورها تُعرِّف منحى التأثير الحركي. القيمة الافتراضية هي (Easing.inOut(Easing.ease.
  • delay: تؤخّر بدء التأثير الحركي بمقدار زمني محدد. القيمة الافتراضية هي صفر.
  • isInteraction: تُحدد ما إذا كان التأثير الحركي سيُنشئ مُتحكِّم تفاعلي (interaction handle) في interacionManagerأم لا، والقيمة الافتراضية هي true.
  • useNativeDriver: تُستخدم برنامج التشغيل الأصلي عندما تكون قيمتها true. القيمة الافتراضية هي false.

spring

static spring(value, config)

يُحرِّك القيمة وفقًأ لنموذج النابض القائم على الحركة التذبذبية التوافقية.

ملاحظة يمكنك تعريف واحد فقط من الخيارات التالية: bounciness/speedأو tension/friction أو stiffness/damping/mass.

تُطابق friction/tension وbounciness/speed خيارات نموذج النابض الخاص بفيسبوك وRebound وOrigami.

  • friction: يتحكم في النسبة bounciness/overshoot، والقيمة الافتراضية هي 7.
  • tension: يتحكم في السرعة، والقيمة الافتراضية هي 40.
  • speed: يتحكم في سرعة التأثير الحركي، والقيمة الافتراضية هي 12.
  • bounciness: يتحكم في القفزات، والقيمة الافتراضية هي 8.

تحديد المعاملات stiffness/damping/mass يجعل Animated.spring تستخدم نموذج نابض تحليلي يعتمد على معاطلات الحركة التذبذبية التوافقية (damped harmonic oscillator). هذا الأسلوب يستعمل قوانين الفيزياء ويُحاكي تطبيق CASpringAnimation على نظام iOS.

  • stiffness: يُحدد معامل صلابة النابض، والقيمة الافتراضية هي 100.
  • damping: يُحدد كيف تتباطأ سُرعة حركة النابض بسبب قوى الاحتكاك، والقيمة الافتراضية هي 10.
  • mass: تُحدد كتلة الجسم المُعَلَّق على النابض، والقيمة الافتراضية هي 1.

معاملات اضافية:

  • velocity: السرعة الابتدائية للجسم المعلَّق على النابض. القيمة الافتراضية هي صفر.
  • overshootClamping: قيمة منطقية تشير إلى ما إذا كان ينبغي تثبيت النابض وإيقاف الارتداد. القيمة الافتراضية هي false.
  • restDisplacementThreshold : يحدد قيمة عتبة الإزاحة من السكون والتي يجب اعتبار النابض تحتها في حالة سكون (عدم حركة). القيمة الافتراضية هي 0.001.
  • restSpeedThreshold: يحدد السرعة التي يعتبر عندها النابض في حالة سكون، وتقاس بوحدات البكسل في الثانية، أمّا القيمة الافتراضية فهي 0.001.
  • delay: تؤخر بدء التأثير الحركي بمقدار زمني محدد، والقيمة الافتراضية هي الصفر.
  • isInteraction: تُحدد ما إذا كان التأثير الحركي سيُنشئ مُتحكِّم تفاعلي (interaction handle) في interacionManagerأم لا. القيمة الافتراضية هي true.
  • useNativeDriver: تستخدم برنامج التشغيل الأصلي عندما تكون قيمتها true. القيمة الافتراضية هي false.

add()‎

تُنشئ تأثير حركي جديد ناتج عن دمج تأثيرين حركيين مع بعضهما البعض.

static add(a,b)

substract

تُنشئ تأثير حركي جديد عن طريق طرح التأثير الحركي الثاني من التأثير الحركي الأول.

static subtract(a,b)

divide()‎

تُنشئ تأثير حركي جديد عن طريق قسمة التأثير الحركي الأول على التأثير الحركي الثاني.

static divide(a,b)

multiply()‎

تُنشئ تأثير حركي جديد عن طريق ضرب التأثير الحركي الأول في التأثير الحركي الثاني.

static multiply(a,b)

modulo()‎

تُنشئ تأثير حركي جديد عن طريق أخذ باقي قسمة التأثير الحركي الأول على التأثير الحركي الثاني.

static modulo(a,b)

diffClamp

تُنشئ قيمةً متحركةً جديدةً محدودة بين قيمتين، ويُستخدم الفرق بين القيمة الأخيرة، لذلك فحتى إذا كانت القيمة بعيدةً عن الحدود فستبدأ في التغيير عندما تبدأ القيمة في الاقتراب مرّةً أخرى (value = clamp(value + diff, min, max)).

هذا مفيد مع أحداث التمرير، فلإظهار شريط التنقل عند التمرير لأعلى مثلًا وإخفاءه عند التمرير لأسفل، نستخدم ما يلي:

static diffClamp(a, min, max)

delay()‎

تؤخّر بدء التأثير الحركي بمقدار زمني محدَّد.

static delay(time)

sequence()‎

تُنفذ عددًا من التأثيرات الحركية متتابعةً الواحدة تلو الآخرى.

static sequence(animations)

parallel()‎

تنفذ عددًا من التأثيرات الحركية (مصفوفة من الحركات) في نفس الوقت متوازيةً، وعند توقف تأثير حركي واحد افتراضيًا فستتوقف جميع التأثيرات الحركية الأخرى، ويمكن تجاوز هذا السلوك باستخدام المُعرِّف stopTogether.

static parallel(animations, config?)

stagger()‎

مصفوفة من التأثيرات الحركية تنفذ متوازيةً (متداخلة)، ولكنها تبدأ تسلسليًا بتأخيرات معيّنة مناسبة لعمل تأثيرات زائدة.

loop()‎

تُكرر التأثيرات الحركية باستمرار، إذ يحدث التكرار دون حظر سلسلة جافا سكريبت، وفي حال كانت قيمة الخاصية useNativeDriver هي true.

من الممكن منع الحلقات للمكونات المبنية على المكون VirtualizedList من عرض المزيد من الصفوف أثناء تشغيل التأثير الحركي، ويمكن إصلاح هذا عن طريق إعطاء الخاصية isInteraction القيمةَ false.

  • iterations: عدد مرات تكرار التأثيرات الحركية، والقيمة الافتراضية هي -1 وتعني إعادة التكرار إلى ما لا نهاية.

event()‎

static event(argMapping, config?)

تأخذ مصفوفة بيانات وتستخرج قيم التأثيرات الحركية من هذه البيانات. ثم تستدعى الدالة setValueعلى المخرجات المعيّنة.

مثال

 onScroll={Animated.event(
   [{nativeEvent: {contentOffset: {x: this._scrollX}}}],
   {listener: (event) => console.log(event)}, // Optional async listener
 )}
 ...
 onPanResponderMove: Animated.event([
   null,                // raw event arg ignored
   {dx: this._panX}],    // gestureState arg
{listener: (event, gestureState) => console.log(event, gestureState)}, // Optional async listener
 ),

يحتوي الكائن config على الخيارات التالية:

  • listener: (اختياري) مستمع غير متزامن.
  • useNativeDriver: تستخدم برنامج التشغيل الأصلي عندما تكون قيمتها true، والقيمة الإفتراضية هيfalse.

forkEvent()‎

static forkEvent(event, listener)

واجهة برمجية حديثة لمراقبة الأحداث المتحركة التي تُمرّر في صورة معاملات، حيث تسمح بإضافة مستمع جديد إلى المستمع AnimatedEvent الموجود مسبقًا، فإذا كان animatedEvent مستمعًا لجافا سكريبت فسيدمج المستعمان معًا في مستمع واحد؛ أمّا إذا كان animatedEvent خالي (أي قيمته null أو undefined)، فسيُعيَّن مستمع جافا سكريبت مباشرةً. تستخدم القيم مباشرةً إذا كان ذلك ممكنًا.

unforkEvent()‎

static unforkEvent(event, listener)

start()‎

static start([callback]: ?(result?: {finished: boolean}) => void)

تبدأ التأثيرات الحركية عندما تُستدعى الدالة ()start، والتي بدورها تأخذ دالة أخرى تُستدعى عند إيقاف التأثير الحركي عن طريق الدالة ()stop.

الاسم النوع مطلوب الوصف
callback ({result?: {finished: boolean)? لا تُستدعى الدالة عندما يوقّف التأثير الحركي باستخدام الدالة stop أو عن انتهائه.

إليك مثال مع دالة رد نداء:

Animated.timing({}).start(({ finished }) => {
  /* completion callback */
});

stop()‎

static stop()

توقف جميع التأثيرات الحركية قيد التنفيذ.

reset()‎

static reset()

توقف جميع التأثيرات الحركية قيد التنفيذ وتعيد قيمتها للقيمة الابتدائية.

الخاصيات

value

القيمة الأساسية للتأثيرات الحركية، وعادةً ما تأخذ القيمة صفر في البداية أي new Animated.Value(0);‎.

انظر صفحة المتغير Animated.Value لمزيد من المعلومات.

valueXY

كائن ثُنائي الابعاد يستخدم لإنشاء التأثيرات الحركية ثنائية الابعاد.

انظر صفحة المتغير Animated.ValueXY لمزيد من المعلومات.

Interpolation

صُدّرت لاستخدام أنواع الاستيفاء في التدفق

Node

جميع القيم المتحركة مشتقة من هذا الصنف، وذلك لسهولة فحص أنواع البيانات عليه.

createAnimatedComponent

تستخدم لجعل المكونات قابلة للتحريك.

attachNativeEvent

واجهة برمجية ضرورية لاضافة القيم المتحرِّكة للأحداث في مكون العرض. يُفضّل استخدام Animated.eventمع الخاصية useNativeDriver: true.

المصادر

صفحة Animated في توثيق React Native الرسمي.