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

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
ط
ط (إتمام رفع المحتوى)
سطر 1: سطر 1:
 
<noinclude>{{DISPLAYTITLE:Image في React Native}}</noinclude>
 
<noinclude>{{DISPLAYTITLE:Image في React Native}}</noinclude>
المكوّن الخاصّ بإظهار مختلف أنواع الصور في منصّة React، والتي تتضمّن صور الشّبكة وصور المصادر الثابتة (static resources) والصّور المحلّيّة المؤقّتة والصور المخزّنة على القرص المحلي كمعرض الصور.
+
المكوّن الخاصّ بإظهار مختلف أنواع الصّور في منصّة React، والتي تتضمّن صور الشّبكة وصور المصادر الثّابتة (static resources) والصّور المحلّيّة المؤقّتة والصّور المخزّنة على القرص المحلّي كمعرض الصور.
 +
 
 +
يبين المثال التّالي كيفيّة جلب الصّور من وسائط التّخزين المحليّة ومن الشّبكة، وكذلك من المعطيات الواردة من <code>:data</code> الخاصّة بعنوان uri، ثم إظهارها.
 +
 
 +
'''ملاحظة:''' يجب تحديد أبعاد الصورة يدويًّا عند جلبها من الشّبكة أو من المصدر data.
  
يبين المثال التالي كيفية جلب الصور من وسائط التخزين المحلية ومن الشبكة، وكذلك من المعطيات الواردة من <code>data:</code> الخاصة بعنوان uri، ثم إظهارها.<blockquote>'''ملاحظة:''' يجب تحديد أبعاد الصورة يدويًا عند جلبها من الشبكة أو من المصدر data.</blockquote>
 
 
__toc__
 
__toc__
 
== أمثلة ==
 
== أمثلة ==
  
 
* مثال لمكوِّن دالّة (Function Component)
 
* مثال لمكوِّن دالّة (Function Component)
 +
<syntaxhighlight lang="javascript">
 +
import React from 'react';
 +
import { View, Image, StyleSheet } from 'react-native';
 +
 +
const styles = StyleSheet.create({
 +
 container: {
 +
   paddingTop: 50,
 +
  },
 +
 tinyLogo: {
 +
   width: 50,
 +
   height: 50,
 +
  },
 +
 logo: {
 +
   width: 66,
 +
   height: 58,
 +
  },
 +
});
 +
 +
const DisplayAnImage = () => {
 +
 return (
 +
   <View style={styles.container}>
 +
     <Image
 +
       style={styles.tinyLogo}
 +
       source={require('@expo/snack-static/react-native-logo.png')}
 +
     />
 +
     <Image
 +
       style={styles.tinyLogo}
 +
       source={{
 +
         uri: 'https://reactnative.dev/img/tiny_logo.png',
 +
       }}
 +
     />
 +
     <Image
 +
       style={styles.logo}
 +
       source={{
 +
         uri:
 +
           'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAAAzCAYAAAA6oTAqAAAAEXRFWHRTb2Z0d2FyZQBwbmdjcnVzaEB1SfMAAABQSURBVGje7dSxCQBACARB+2/ab8BEeQNhFi6WSYzYLYudDQYGBgYGBgYGBgYGBgYGBgZmcvDqYGBgmhivGQYGBgYGBgYGBgYGBgYGBgbmQw+P/eMrC5UTVAAAAABJRU5ErkJggg==',
 +
       }}
 +
     />
 +
   </View>
 +
  );
 +
}
 +
 +
export default DisplayAnImage;
 +
</syntaxhighlight>
 +
* مثال لمكوِّن صنف (Class Component)
 +
<syntaxhighlight lang="javascript">
 +
import React, { Component } from 'react';
 +
import { AppRegistry, View, Image, StyleSheet } from 'react-native';
 +
 +
const styles = StyleSheet.create({
 +
 container: {
 +
   paddingTop: 50,
 +
  },
 +
 tinyLogo: {
 +
   width: 50,
 +
   height: 50,
 +
  },
 +
 logo: {
 +
   width: 66,
 +
   height: 58,
 +
  },
 +
});
 +
 +
class DisplayAnImage extends Component {
 +
 render() {
 +
   return (
 +
     <View style={styles.container}>
 +
       <Image
 +
         style={styles.tinyLogo}
 +
         source={require('@expo/snack-static/react-native-logo.png')}
 +
       />
 +
       <Image
 +
         style={styles.tinyLogo}
 +
         source={{uri: 'https://reactnative.dev/img/tiny_logo.png'}}
 +
       />
 +
       <Image
 +
         style={styles.logo}
 +
         source={{uri: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAAAzCAYAAAA6oTAqAAAAEXRFWHRTb2Z0d2FyZQBwbmdjcnVzaEB1SfMAAABQSURBVGje7dSxCQBACARB+2/ab8BEeQNhFi6WSYzYLYudDQYGBgYGBgYGBgYGBgYGBgZmcvDqYGBgmhivGQYGBgYGBgYGBgYGBgYGBgbmQw+P/eMrC5UTVAAAAABJRU5ErkJggg=='}}
 +
       />
 +
     </View>
 +
   );
 +
  }
 +
}
 +
 +
export default DisplayAnImage;
 +
</syntaxhighlight>كما يمكن إضافة تنسيقٍ <code>style</code> للصّورة كما يلي:
  
import React from 'react';
+
* مثال لمكوِّن دالّة (Function Component)
 
+
<syntaxhighlight lang="javascript">
import { View, Image, StyleSheet } from 'react-native';
+
import React from 'react';
 
+
import { View, Image, StyleSheet } from 'react-native';
+
 
+
const styles = StyleSheet.create({
const styles = StyleSheet.create({
+
 container: {
 
+
   paddingTop: 50,
   container: {
+
  },
 
+
 stretch: {
     paddingTop: 50,
+
   width: 50,
 
+
   height: 200,
  },
+
   resizeMode: 'stretch',
 
+
   },
   tinyLogo: {
+
});
 
+
     width: 50,
+
const DisplayAnImageWithStyle = () => {
 
+
 return (
     height: 50,
+
   <View style={styles.container}>
 
+
     <Image
  },
+
       style={styles.stretch}
 
+
       source={require('@expo/snack-static/react-native-logo.png')}
   logo: {
+
     />
 
+
   </View>
     width: 66,
+
  );
 
+
}
      height: 58,
+
 
+
export default DisplayAnImageWithStyle;
  },
+
</syntaxhighlight>
 
+
* مثال لمكوِّن صنف (Class Component)
});
+
<syntaxhighlight lang="javascript">
 
+
import React, { Component } from 'react';
+
import { View, Image, StyleSheet } from 'react-native';
 
+
const DisplayAnImage = () => {
+
const styles = StyleSheet.create({
 
+
 stretch: {
   return (
+
     width: 50,
 
+
   height: 200,
     <View style={styles.container}>
+
   resizeMode: 'stretch'
 
+
  }
       <Image
+
});
 
+
         style={styles.tinyLogo}
+
class DisplayAnImageWithStyle extends Component {
 
+
 render() {
         source={require('@expo/snack-static/react-native-logo.png')}
+
   return (
 
+
     <View>
       />
+
       <Image
 
+
         style={styles.stretch}
       <Image
+
           source={require('@expo/snack-static/react-native-logo.png')}
 
+
         />
         style={styles.tinyLogo}
+
     </View>
 
+
   );
<nowiki>        source={{</nowiki>
+
  }
 
+
}
           uri: '<nowiki>https://reactnative.dev/img/tiny_logo.png'</nowiki>,
+
 
+
export default DisplayAnImageWithStyle;  
  <nowiki>       }}</nowiki>
+
</syntaxhighlight>
 
 
       />
 
 
 
       <Image
 
 
 
         style={styles.logo}
 
 
 
  <nowiki>        source={{</nowiki>
 
 
 
           uri:
 
 
 
             'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAAAzCAYAAAA6oTAqAAAAEXRFWHRTb2Z0d2FyZQBwbmdjcnVzaEB1SfMAAABQSURBVGje7dSxCQBACARB+2/ab8BEeQNhFi6WSYzYLYudDQYGBgYGBgYGBgYGBgYGBgZmcvDqYGBgmhivGQYGBgYGBgYGBgYGBgYGBgbmQw+P/eMrC5UTVAAAAABJRU5ErkJggg==',
 
 
 
  <nowiki>       }}</nowiki>
 
 
 
       />
 
 
 
     </View>
 
 
 
  );
 
 
 
}
 
 
 
 
 
 
export default DisplayAnImage;
 
 
 
* مثال لمكوِّن الصنف (Class Component)
 
  
import React, { Component } from 'react';
+
== دعم صور GIF وWebP على منصة Android ==
 
+
لا تُدعم الصّور من نوع GIF وWebP افتراضيًّا على منصّة Android عند بناء شفرة أصيلة شخصيّة، لذا يجب إضافة بعض الوحدات الاختياريّة على المسار <code>android/app/build.gradle</code> بما يتوافق مع حاجة التّطبيق.<syntaxhighlight lang="javascript">
import { AppRegistry, View, Image, StyleSheet } from 'react-native';
+
dependencies {
 
+
 // If your app supports Android versions before Ice Cream Sandwich (API level 14)
+
 implementation 'com.facebook.fresco:animated-base-support:1.3.0'
 
+
const styles = StyleSheet.create({
+
   // For animated GIF support
 
+
 implementation 'com.facebook.fresco:animated-gif:2.0.0'
   container: {
+
 
+
   // For WebP support, including animated WebP
     paddingTop: 50,
+
 implementation 'com.facebook.fresco:animated-webp:2.1.0'
 
+
 implementation 'com.facebook.fresco:webpsupport:2.0.0'
  },
+
 
+
   // For WebP support, without animations
   tinyLogo: {
+
 implementation 'com.facebook.fresco:webpsupport:2.0.0'
 
+
}
     width: 50,
+
</syntaxhighlight>
 
 
     height: 50,
 
 
 
  },
 
 
 
   logo: {
 
 
 
     width: 66,
 
 
 
     height: 58,
 
 
 
  },
 
 
 
});
 
 
 
 
 
 
class DisplayAnImage extends Component {
 
 
 
   render() {
 
 
 
     return (
 
 
 
       <View style={styles.container}>
 
 
 
         <Image
 
 
 
           style={styles.tinyLogo}
 
 
 
           source={require('@expo/snack-static/react-native-logo.png')}
 
 
 
         />
 
 
 
         <Image
 
 
 
           style={styles.tinyLogo}
 
 
 
           source=<nowiki>{{uri: 'https://reactnative.dev/img/tiny_logo.png'}}</nowiki>
 
 
 
         />
 
 
 
         <Image
 
 
 
           style={styles.logo}
 
 
 
           source=<nowiki>{{uri: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAAAzCAYAAAA6oTAqAAAAEXRFWHRTb2Z0d2FyZQBwbmdjcnVzaEB1SfMAAABQSURBVGje7dSxCQBACARB+2/ab8BEeQNhFi6WSYzYLYudDQYGBgYGBgYGBgYGBgYGBgZmcvDqYGBgmhivGQYGBgYGBgYGBgYGBgYGBgbmQw+P/eMrC5UTVAAAAABJRU5ErkJggg=='}}</nowiki>
 
 
 
         />
 
 
 
       </View>
 
 
 
     );
 
 
 
  }
 
 
 
}
 
 
 
 
 
 
export default DisplayAnImage;
 
كما يمكن إضافة تنسيقٍ <code>style</code> للصورة كما يلي:
 
 
 
* مثال لمكوِّن الدالّة (Function Component)
 
 
 
import React from 'react';
 
 
 
import { View, Image, StyleSheet } from 'react-native';
 
 
 
 
 
 
const styles = StyleSheet.create({
 
 
 
   container: {
 
 
 
     paddingTop: 50,
 
 
 
  },
 
 
 
   stretch: {
 
 
 
     width: 50,
 
 
 
     height: 200,
 
 
 
     resizeMode: 'stretch',
 
 
 
  },
 
 
 
});
 
 
 
 
 
 
const DisplayAnImageWithStyle = () => {
 
 
 
   return (
 
 
 
     <View style={styles.container}>
 
 
 
       <Image
 
 
 
         style={styles.stretch}
 
 
 
         source={require('@expo/snack-static/react-native-logo.png')}
 
 
 
       />
 
 
 
     </View>
 
 
 
  );
 
 
 
}
 
 
 
 
 
 
export default DisplayAnImageWithStyle;
 
 
 
* مثال لمكوِّن الصنف (Class Component)
 
 
 
import React, { Component } from 'react';
 
 
 
import { View, Image, StyleSheet } from 'react-native';
 
 
 
 
 
 
const styles = StyleSheet.create({
 
 
 
   stretch: {
 
 
 
     width: 50,
 
 
 
     height: 200,
 
 
 
     resizeMode: 'stretch'
 
 
 
  }
 
 
 
});
 
 
 
 
 
 
class DisplayAnImageWithStyle extends Component {
 
 
 
   render() {
 
 
 
     return (
 
 
 
       <View>
 
 
 
         <Image
 
 
 
           style={styles.stretch}
 
 
 
           source={require('@expo/snack-static/react-native-logo.png')}
 
 
 
         />
 
 
 
       </View>
 
 
 
     );
 
 
 
  }
 
 
 
}
 
 
 
 
 
 
export default DisplayAnImageWithStyle;
 
 
 
== دعم صور GIF و WebP على منصة Android ==
 
لا تُدعم الصور من نوع GIF و WebP بشكلٍ افتراضيٍّ على منصة Android عند بناء شفرة أصيلة شخصية، لذا يجب إضافة بعض الوحدات الاختيارية على المسار <code>android/app/build.gradle</code> بما يتوافق مع حاجة التطبيق.
 
dependencies {
 
 
 
   // If your app supports Android versions before Ice Cream Sandwich (API level 14)
 
 
 
   implementation 'com.facebook.fresco:animated-base-support:1.3.0'
 
 
 
 
 
 
 
   // For animated GIF support
 
 
 
   implementation 'com.facebook.fresco:animated-gif:2.0.0'
 
 
 
 
 
 
 
   // For WebP support, including animated WebP
 
 
 
   implementation 'com.facebook.fresco:animated-webp:2.1.0'
 
 
 
   implementation 'com.facebook.fresco:webpsupport:2.0.0'
 
 
 
 
 
 
 
   // For WebP support, without animations
 
 
 
   implementation 'com.facebook.fresco:webpsupport:2.0.0'
 
 
 
}
 
  
 
== الخاصيات ==
 
== الخاصيات ==
  
 
=== <code>style</code> ===
 
=== <code>style</code> ===
الخاصية <code>ImageResizeMode</code> هي من نوع <code>enum</code>، وتُستخدم لتغيير وضع تحجيم الصور، ويتم ضبطها عن طريق خاصيّة التنسيق <code>ResizeMode</code> في المكون <code>Image</code>، ويمكن أن تأخذ إحدى القيم (<code>contain</code>,<code>cover</code>, <code>stretch</code>,<code>center</code>,<code>repeat</code>).  
+
الخاصيّة <code>ImageResizeMode</code> هي من نوع <code>enum</code>، وتُستخدم لتغيير وضع تحجيم الصور، ويتم ضبطها عن طريق خاصيّة التنسيق <code>ResizeMode</code> في المكون <code>Image</code>، ويمكن أن تأخذ إحدى القيم (<code>contain</code>,<code>cover</code>, <code>stretch</code>,<code>center</code>,<code>repeat</code>).  
 
{| class="wikitable"
 
{| class="wikitable"
 
!النوع
 
!النوع
سطر 320: سطر 184:
 
|لا
 
|لا
 
|}
 
|}
ومن خاصيات التنسيق أيضًا:
+
ومن خاصيّات التّنسيق أيضًا:
  
 
* [[ReactNative/image style props|<code>Image Style Props...</code>]]
 
* [[ReactNative/image style props|<code>Image Style Props...</code>]]
سطر 328: سطر 192:
  
 
=== <code>accessible</code> ===
 
=== <code>accessible</code> ===
لتحديد قابليّة الوصول للصورة، إذ يمكن الوصول إلى الصّورة إذا كانت قيمتها <code>true</code>.
+
لتحديد قابليّة الوصول للصّورة، إذ يمكن الوصول إلى الصّورة إذا كانت قيمتها <code>true</code>.
 
{| class="wikitable"
 
{| class="wikitable"
 
!النوع
 
!النوع
سطر 340: سطر 204:
  
 
=== <code>accessibilityLabel</code> ===
 
=== <code>accessibilityLabel</code> ===
النص الذي سيقرؤه تطبيق قارئ الشاشة (screen reader) عندما يتفاعل المستخدم مع الصورة.
+
النّص الذي سيقرؤه تطبيق قارئ الشّاشة (screen reader) عندما يتفاعل المستخدم مع الصّورة.
 +
{| class="wikitable"
 +
!النوع
 +
!مطلوب
 +
!المنصة
 +
|-
 +
|سلسلة نصية (string)
 +
|لا
 +
|iOS
 +
|}
  
 
=== <code>blurRadius</code> ===
 
=== <code>blurRadius</code> ===
نصف قطر التمويه (blur) المطبّق على الصورة.
+
نصف قطر التّمويه (blur) المطبّق على الصورة.
 
{| class="wikitable"
 
{| class="wikitable"
 
!النوع
 
!النوع
سطر 350: سطر 223:
 
|عدد (number)
 
|عدد (number)
 
|لا
 
|لا
|}
+
|}'''ملاحظة:''' يجب أن تكون قيمة <code>blurRadius</code> أكبر من <code>5</code> على منصّة IOS.  
<blockquote>'''ملاحظة:''' يجب أن تكون قيمة <code>blurRadius</code> أكبر من <code>5</code> على منصة IOS. </blockquote>
 
 
 
 
=== <code>capInsets</code>  ===
 
=== <code>capInsets</code>  ===
لتثبيت أبعاد الحواف المحدّدة في <code>capInsets</code> عند تغيير حجم الصورة، بينما تتمدّد باقي أجزاء الصّورة،  وبالتالي تفيد هذه الخاصية في إنشاء عناصر مفيدةٍ متغيّرة الحجم ودائريّة الحوافّ كالأزرار والظلال وغيرها، ويمكن الاطلاع على التوثيق الرسمي لشركة Apple لمزيدٍ من المعلومات.
+
لتثبيت أبعاد الحواف المحدّدة في <code>capInsets</code> عند تغيير حجم الصّورة، بينما تتمدّد باقي أجزاء الصّورة،  وبالتّالي تفيد هذه الخاصيّة في إنشاء عناصر مفيدةٍ متغيّرة الحجم ودائريّة الحوافّ، مثل: الأزرار، والظّلال وغيرها، ويمكن الاطلاع على [https://developer.apple.com/documentation/uikit/uiimage#//apple_ref/occ/instm/UIImage/resizableImageWithCapInsets التّوثيق الرسمي لشركة Apple] لمزيدٍ من المعلومات.
 
{| class="wikitable"
 
{| class="wikitable"
 
!النوع
 
!النوع
سطر 360: سطر 231:
 
!المنصة
 
!المنصة
 
|-
 
|-
|<code>Rect</code>
+
|<code>[[ReactNative/rect|Rect]]</code>
 
|لا
 
|لا
 
|iOS
 
|iOS
سطر 366: سطر 237:
  
 
=== <code>defaultSource</code> ===
 
=== <code>defaultSource</code> ===
لعرض الصّورة الثابتة بينما يحمّل مصدر الصّورة.
+
لعرض الصّورة الثّابتة بينما يحمّل مصدر الصّورة.
 
{| class="wikitable"
 
{| class="wikitable"
 
!النوع
 
!النوع
سطر 380: سطر 251:
 
|Android
 
|Android
 
|}
 
|}
فعند تمريرها ككائنٍ فإنه يكون من الشكل: <code>{uri: string, width: number, height: number, scale: number}</code>  حيث:
+
فعند تمريرها ككائنٍ فسيكون من الشّكل: <code>{uri: string, width: number, height: number, scale: number}</code>  حيث:
  
* <code>uri</code>: سلسلةٌ نصّيةٌ تمثّل معرِّف مصدر الصورة (resource identifier)، والذي يمكن أن يكون مسار الملف المحلّي أو مصدر الصورة الثابت (المغلَّف بالدالة <code>require('./path/to/image.png')</code>).
+
* <code>uri</code>: سلسلةٌ نصّيةٌ تمثّل معرِّف مصدر الصورة (resource identifier)، والذي قد يكون مسار الملف المحلّي، أو مصدر الصّورة الثّابت (المغلَّف بالدالة ‪.<code>require('./path/to/image.png')</code>)
* <code>width</code>، <code>height</code>: يمكن تحديدها عند البناء إذا كانت معروفةً، وتُستخدم لضبط الأبعاد الافتراضية للمكوّن <code><Image/></code>.
+
* <code>width</code>، <code>height</code>: يمكن تحديدها عند البناء إذا كانت معروفةً، وتُستخدم لضبط الأبعاد الافتراضيّة للمكوّن <code><Image/></code>.
* <code>scale</code>: تُستخدم لتحديد مقياس رسم (scale) الصورة، والقيمة الافتراضية له هي 1.0 والتي تعني أن كل بكسل (pixel) من الصورة يقابل نقطة إظهارٍ واحدةٍ DIP.
+
* <code>scale</code>: تُستخدم لتحديد مقياس رسم (scale) الصورة، والقيمة الافتراضيّة له هي 1.0 والتي تعني أنّ كل بكسل (pixel) من الصورة يقابل نقطة إظهارٍ واحدةٍ DIP.
  
أما عند تمريرها كعددٍ:
+
أمّا عند تمريرها كعددٍ:
 
 
* <code>number</code>: نوع مبهم (Opaque) معاد من قبل شيءٍ ما مثل <code>require('./image.jpg')</code>.
 
 
 
<blockquote>'''ملاحظة:''' يتم تجاهل هذه الخاصية أثناء البناء الاختباريّ على منصة Android. </blockquote>
 
  
 +
* <code>number</code>: نوع مبهم (Opaque) معاد من قبل شيءٍ ما مثل ‪.<code>require('./image.jpg')</code>
 +
'''ملاحظة:''' يتم تجاهل هذه الخاصية أثناء البناء الاختباريّ على منصة Android.
 
=== <code>fadeDuration</code> ===
 
=== <code>fadeDuration</code> ===
 
تعمل على منصة Android فقط، وقيمتها الافتراضية هي 300 ميلي ثانية.
 
تعمل على منصة Android فقط، وقيمتها الافتراضية هي 300 ميلي ثانية.
سطر 411: سطر 280:
 
|-
 
|-
 
|مصفوفة، عدد (array of ImageSourcePropTypes, number)
 
|مصفوفة، عدد (array of ImageSourcePropTypes, number)
 +
|لا
 +
|}'''ملاحظة:''' يمكنها قبول العدد الذي تعيده ‪.<code>require('./image.jpg')</code>
 +
=== <code>onError</code> ===
 +
تُستدعى بالحدث <code><nowiki>{{nativeEvent: {error}</nowiki></code> وذلك عند حدوث خطأ في التّحميل.
 +
{| class="wikitable"
 +
!النوع
 +
!مطلوب
 +
|-
 +
|دالة (function)
 
|لا
 
|لا
 
|}
 
|}
<blockquote>'''ملاحظة:''' يمكنها قبول العدد الذي تعيده <code>require('./image.jpg')</code>.</blockquote>
 
 
=== <code>onError</code> ===
 
تُستدعى بالحدث <code><nowiki>{nativeEvent: {error}}</nowiki></code> وذلك عند حدوث خطأ في التحميل.
 
  
 
=== <code>onLayout</code> ===
 
=== <code>onLayout</code> ===
تُستدعى بالحدث <code><nowiki>{nativeEvent: {layout: {x, y, width, height}}}</nowiki></code> وذلك عند تغيّر التنسيق.  
+
تُستدعى بالحدث <code><nowiki>{{{nativeEvent: {layout: {x, y, width, height}</nowiki></code> وذلك عند تغيّر التنسيق.  
 +
{| class="wikitable"
 +
!النوع
 +
!مطلوب
 +
|-
 +
|دالة (function)
 +
|لا
 +
|}
  
 
=== <code>onLoad</code> ===
 
=== <code>onLoad</code> ===
تُستدعى عند اكتمال التحميل بنجاح.
+
تُستدعى عند اكتمال التّحميل بنجاح.
 +
{| class="wikitable"
 +
!النوع
 +
!مطلوب
 +
|-
 +
|دالة (function)
 +
|لا
 +
|}
  
 
=== <code>onLoadEnd</code> ===
 
=== <code>onLoadEnd</code> ===
تُستدعى عند اكتمال التحميل سواء أكان ناجحًا أو فاشلًا.
+
تُستدعى عند اكتمال التّحميل سواء أكان ناجحًا أو فاشلًا.
 +
{| class="wikitable"
 +
!النوع
 +
!مطلوب
 +
|-
 +
|دالة (function)
 +
|لا
 +
|}
  
 
=== <code>onLoadStart</code> ===
 
=== <code>onLoadStart</code> ===
تُستدعى عند بدء التحميل. مثال: <code>onLoadStart={(e) => this.setState({loading: true})}</code>
+
تُستدعى عند بدء التحميل، مثال: <code>onLoadStart={(e) => this.setState({loading: true})}</code>
 +
{| class="wikitable"
 +
!النوع
 +
!مطلوب
 +
|-
 +
|دالة (function)
 +
|لا
 +
|}
  
 
=== <code>onPartialLoad</code> ===
 
=== <code>onPartialLoad</code> ===
تُستدعى عند اكتمال تحميل الصورة بشكلٍ جزئيٍّ، ويتعلّق تعريف هذا التحميل الجزئي بالمُحمِّل (loader)، وتستخدم هذه الخاصيّة مع التحميلات المتقدمة (progressive) لصور JPEG.  
+
تُستدعى عند اكتمال تحميل الصّورة جزئيًّا، ويتعلّق تعريف هذا التّحميل الجزئي بالمُحمِّل (loader)، وتستخدم هذه الخاصيّة مع التحميلات المتقدّمة (progressive) لصور JPEG.  
 +
{| class="wikitable"
 +
!النوع
 +
!مطلوب
 +
!المنصة
 +
|-
 +
|دالة (function)
 +
|لا
 +
|iOS
 +
|}
  
 
=== <code>onProgress</code> ===
 
=== <code>onProgress</code> ===
تُستدعى بالحدث <code><nowiki>{nativeEvent: {loaded, total}}</nowiki></code> وذلك عند تقدم التّحميل.  
+
تُستدعى بالحدث <code><nowiki>{{nativeEvent: {loaded, total}</nowiki></code> وذلك عند تقدم التّحميل.  
 +
{| class="wikitable"
 +
!النوع
 +
!مطلوب
 +
!المنصة
 +
|-
 +
|دالة (function)
 +
|لا
 +
|iOS
 +
|}
  
 
=== <code>progressiveRenderingEnabled</code> ===
 
=== <code>progressiveRenderingEnabled</code> ===
تعمل على منصة Android فقط، وتُستخدم لتمكين تدفق (streaming) صور JPEG المتقدم. ويمكن زيارة الرابط <code>[./https://frescolib.org/docs/progressive-jpegs.html https://frescolib.org/docs/progressive-jpegs.html]</code> لمزيد من المعلومات.
+
تعمل على منصّة Android فقط، وتُستخدم لتمكين تدفّق (streaming) صور JPEG المتقدم. ويمكن زيارة [https://frescolib.org/docs/progressive-jpegs.html Progressive JPEGs] لمزيد من المعلومات.
 +
{| class="wikitable"
 +
!النوع
 +
!مطلوب
 +
!المنصة
 +
|-
 +
|قيمة منطقية (bool)
 +
|لا
 +
|Android
 +
|}
  
 
=== <code>resizeMethod</code> ===
 
=== <code>resizeMethod</code> ===
تحدد الطريقة المستخدمة في تغيير أبعاد الصورة المحمّلة في حال اختلاف أبعادها عن الأبعاد التي ستُعرض بها:
+
تحدّد الطريقة المستخدمة في تغيير أبعاد الصّورة المحمّلة في حال اختلاف أبعادها عن الأبعاد التي ستُعرض بها:
  
* <code>auto</code>: وهي الطريقة الافتراضية، وتقوم على التجريب للاختيار بين الطريقتين <code>resize</code> و <code>scale</code>.
+
* <code>auto</code>: وهي الطّريقة الافتراضيّة، وتقوم على التّجريب للاختيار بين الطّريقتين <code>resize</code>، و<code>scale</code>.
* <code>resize</code>: عمليّةٌ برمجيّةٌ تعالج الصورة المرمّزة (encoded) في الذاكرة قبل فكّ ترميزها. ويجب استخدامها بدلًا من <code>scale</code> عندما تكون الصورة أكبر من العرض.
+
* <code>resize</code>: عمليّةٌ برمجيّةٌ تعالج الصّورة المرمّزة (encoded) في الذّاكرة قبل فكّ ترميزها، ويجب استخدامها بدلًا من <code>scale</code> عندما تكون الصّورة أكبر من العرض.000000000002222
* <code>scale</code>: ترسم الصورة بشكلٍ مكبّرٍ أو مصغّرٍ، وهي أسرع من الطريقتين السابقتين كونها تستخدم مسرع الجهاز الرسومي (hardware accelerated)، وتُنتج صورًا ذات جودةٍ أعلى. تستخدَم عندما تكون الصور أصغر من العرض أو أكبر قليلًا.
+
* <code>scale</code>: ترسم الصّورة  مكبّرةً أو مصغّرة، وهي أسرع من الطّريقتين السّابقتين كونها تَستخدم مسرّع الجهاز الرّسومي (usually hardware accelerated )، وتُنتج صورًا ذات جودةٍ أعلى. تستخدَم عندما تكون الصّور أصغر من العرض 000000000000000000002222222 أو أكبر قليلًا.
  
ويمكن زيارة <code>[./https://frescolib.org/docs/resizing.html https://frescolib.org/docs/resizing.html]</code> لمزيد من المعلومات حول <code>resize</code> و <code>scale</code>.
+
ويمكن زيارة [https://frescolib.org/docs/resizing.html Resizing] لمزيد من المعلومات حول <code>resize</code>، و<code>scale</code>.
 +
{| class="wikitable"
 +
!النوع
 +
!مطلوب
 +
!المنصة
 +
|-
 +
|قيمة متعدّدة <code>‪(enum('auto', 'resize', 'scale'))</code>
 +
|لا
 +
|Android
 +
|}
  
 
=== <code>resizeMode</code> ===
 
=== <code>resizeMode</code> ===
تحدد الطريقة التي ستُستخدم لتغيير أبعاد الصورة الأوّليّة (raw image) في حال اختلاف أبعادها عن أبعاد إطار (frame) العرض:
+
تحدّد الطّريقة التي ستُستخدم لتغيير أبعاد الصّورة الأوّليّة (raw image) في حال اختلاف أبعادها عن أبعاد إطار (frame) العرض0000000000000222222222:
  
* <code>cover</code>: وهي الطريقة الافتراضية، حيث تغيّر مقياس رسم (scale) الصورة بانتظامٍ (يحافظ على نسبة ارتفاع الصّورة إلى عرضها (aspect ratio))، بحيث تصبح أبعاد الصّورة أكبر أو تساوي أبعاد الإطار (بعد طرح الحواشي (padding)).
+
* <code>cover</code>: وهي الطّريقة الافتراضيّة، حيث تغيّر مقياس رسم (scale) الصّورة بانتظامٍ (يحافظ على نسبة ارتفاع الصّورة إلى عرضها (aspect ratio))، بحيث تصبح أبعاد الصّورة أكبر أو تساوي أبعاد الإطار (بعد طرح الحواشي (padding)).
 
* <code>contain</code>: تغيّر مقياس رسم (scale) الصورة بانتظام (يحافظ على نسبة ارتفاع الصّورة إلى عرضها (aspect ratio))، بحيث تصبح أبعاد الصّورة أصغر أو تساوي أبعاد الإطار (بعد طرح الحواشي (padding)).
 
* <code>contain</code>: تغيّر مقياس رسم (scale) الصورة بانتظام (يحافظ على نسبة ارتفاع الصّورة إلى عرضها (aspect ratio))، بحيث تصبح أبعاد الصّورة أصغر أو تساوي أبعاد الإطار (بعد طرح الحواشي (padding)).
 
* <code>stretch</code>: تغيّر ارتفاع الصورة وعرضها بشكلٍ مستقلٍ (independently)، مما قد يؤدي لتغيير نسبة ارتفاع الصورة إلى عرضها.
 
* <code>stretch</code>: تغيّر ارتفاع الصورة وعرضها بشكلٍ مستقلٍ (independently)، مما قد يؤدي لتغيير نسبة ارتفاع الصورة إلى عرضها.
* <code>repeat</code>: تكرر الصورة حتى تغطي كامل إطار العرض مع المحافظة على أبعادها إذا كانت أصغر من الإطار، أما إذا كانت أكبر منه فإنها تغيّر مقياس رسم الصّورة بانتظام بحيث يحتويها الإطار.
+
* <code>repeat</code>: تكرر الصورة حتى تغطي كامل إطار العرض مع المحافظة على أبعادها إذا كانت أصغر من الإطار؛ أمّا إذا كانت أكبر منه فستغيّر مقياس رسم الصّورة بانتظام بحيث يحتويها الإطار.
* <code>center</code>: تضع الصورة في مركز الإطار بحيث تكون أبعادها موازيةً لأبعاد الإطار إذا كانت أصغر منه، أما إذا كانت أكبر منه فإنها تغيّر مقياس رسم الصورة بانتظامٍ بحيث يحتويها الإطار.
+
* <code>center</code>: تضع الصورة في مركز الإطار بحيث تكون أبعادها موازيةً لأبعاد الإطار إذا كانت أصغر منه؛ أمّا إذا كانت أكبر منه فستغيّر مقياس رسم الصّورة بانتظامٍ بحيث يحتويها الإطار.
 +
{| class="wikitable"
 +
!النوع
 +
!مطلوب
 +
|-
 +
|قيمة متعددة <code>‪(enum('cover', 'contain', 'stretch', 'repeat', 'center'))</code>
 +
|لا
 +
|}
  
 
=== <code>source</code> ===
 
=== <code>source</code> ===
تمثل هذه الخاصيّة مصدر الصورة، سواء كان عنوان URL بعيدًا (remote) أو ملفًّا محلّيًّا (local).
+
تمثّل هذه الخاصيّة مصدر الصّورة، سواء كان عنوان URL بعيدًا (remote) أو ملفًّا محلّيًّا (local).
  
كما يمكن أن تتضمن هذه الخاصيّة العديد من عناوين URL البعيدة مع تحديد العرض والارتفاع وربما مقياس الرسم وغيرها من معاملات URL، فيقوم التطبيق الأصيل باختيار أفضل uri ليعرضه وذلك اعتمادًا على أبعاد حاوية الصورة (image container)، كما يمكن إضافة الخاصية cache للتحكم بكيفيّة تفاعل الطّلبات الشّبكيّة مع التخزين المحلّيّ المؤقّت (local cache). ويمكن الإطلاع على التحكم بالتخزين المؤقت للصور لمزيد من المعلومات.
+
كما يمكن أن تتضمن هذه الخاصيّة العديد من عناوين URL البعيدة مع تحديد العرض، والارتفاع وربّما مقياس الرّسم وغيرها من معاملات URL، فيقوم التّطبيق الأصيل باختيار أفضل <code>uri</code> ليعرضه وذلك اعتمادًا على أبعاد حاوية الصورة (image container)، كما يمكن إضافة الخاصية <code>cache</code> للتحكم بكيفيّة تفاعل الطّلبات الشّبكيّة مع التخزين المحلّيّ المؤقّت (local cache). ويمكن الإطلاع على [[ReactNative/images|التحكم بالتخزين المؤقت للصور]] لمزيد من المعلومات.
  
إن صيغ الصور (format) المدعومة حاليًّا على منصة Android هي (<code>png</code>, <code>jpg</code>,<code>jpeg</code>, <code>bmp</code>, <code>gif</code>,<code>webp</code>)، والصيغة <code>psd</code> على منصة iOS. كما تدعم منصة iOS العديد من صيغ الصور الصرفة (RAW)، ويمكن الرجوع إلى توثيق شركة Apple للإطلاع على قائمة الكاميرات المدعومة (وفيما يخص الإصدار iOS 12 فإنه يمكن زيارة <code>[./https://support.apple.com/en-ca/HT208967 https://support.apple.com/en-ca/HT208967]</code>).
+
صيغ الصّور (format) المدعومة حاليًّا على منصّة Android هي: (<code>png</code>, <code>jpg</code>,<code>jpeg</code>, <code>bmp</code>, <code>gif</code>,<code>webp</code>)، والصيغة <code>psd</code> على منصة iOS. كما تدعم منصة iOS العديد من صيغ الصّور الصّرفة (RAW)، ويمكن الرّجوع إلى توثيق شركة Apple للإطلاع على قائمة الكاميرات المدعومة (وفيما يخص الإصدار iOS 12 فيمكن زيارة [https://support.apple.com/en-ca/HT208967 support apple].  
 +
{| class="wikitable"
 +
!النوع
 +
!مطلوب
 +
|-
 +
|ImageSourcePropType
 +
|لا
 +
|}
  
 
=== <code>testID</code> ===
 
=== <code>testID</code> ===
سطر 469: سطر 421:
 
== التوابع ==
 
== التوابع ==
  
=== <code>getSize()</code> ===
+
=== <code>getSize()</code> ===
Image.getSize(uri, success, [failure]);
+
<syntaxhighlight lang="javascript">
يعيد ارتفاع وعرض الصورة بالبكسل قبل إظهارها، ويمكن أن يفشل عند عدم وجود الصورة أو فشل تحميلها.
+
Image.getSize(uri, success, [failure]);
 +
</syntaxhighlight>يعيد ارتفاع وعرض الصّورة بالبكسل قبل إظهارها، ويمكن أن يفشل عند عدم وجود الصورة، أو فشل تحميلها.
  
يجب تحميل الصورة في البداية ثم تخزينها بشكلٍ مؤقّتٍ قبل أن يتمكّن هذا التابع من استرجاع أبعادها، مما يعني أنه يمكن من حيث المبدأ استخدام هذا التابع لتحميل الصّورة مسبقًا (preload)، غير أنه ليس الأمثل لهذا الغرض، ويمكن في المستقبل أن يُبرمَج بحيث لا يحتاج لتحميل كامل معطيات الصورة. ويفضل أن تحمّل الصور مسبقًا عن طريق واجهة برمجية مستقلة.  
+
يجب تحميل الصّورة في البداية، ثم تخزينها مؤقّتًا قبل تمكُّن هذا التّابع من استرجاع أبعادها، ممّا يعني أنّه يمكن من حيث المبدأ استخدام هذا التّابع لتحميل الصّورة مسبقًا (preload)، ومع ذلك فهو ليس الأمثل لهذا الغرض، ويمكن في المستقبل أن يُبرمَج بحيث لا يحتاج لتحميل كامل معطيات الصورة. ويفضل تحميل الصّور مسبقًا عن طريق واجهة برمجيّة مستقلة.  
  
 
==== المعاملات ====
 
==== المعاملات ====
 +
{| class="wikitable"
 +
!الاسم
 +
!النوع
 +
!مطلوب
 +
!الوصف
 +
|-
 +
|<code>uri</code>
 +
|سلسلة نصية (string)
 +
|نعم
 +
|موقع الصورة
 +
|-
 +
|<code>success</code>
 +
|دالة (function)
 +
|نعم
 +
|الدالة التي ستطلب عند إيجاد الصورة بنجاحٍ واستعادة ارتفاعها وعرضها
 +
|-
 +
|<code>failure</code>
 +
|دالة (function)
 +
|لا
 +
|الدالة التي ستطلب عند حدوث خطأ كالفشل في استعادة الصورة
 +
|}
  
=== <code>getSizeWithHeaders()</code> ===
+
=== <code>getSizeWithHeaders()</code>===
Image.getSizeWithHeaders(uri, headers, success, [failure]);
+
<syntaxhighlight lang="javascript">
يعيد ارتفاع الصّورة وعرضها بالبكسل قبل إظهارها مع إمكانية إعطاء الترويسات (headers) للطلب، ويمكن أن يفشل عند عدم وجود الصورة أو فشل تحميلها.
+
Image.getSizeWithHeaders(uri, headers, success, [failure]);
 +
</syntaxhighlight>يعيد ارتفاع الصّورة وعرضها بالبكسل قبل إظهارها مع إمكانية إعطاء الترويسات (headers) للطلب، ويمكن أن يفشل عند عدم وجود الصورة أو فشل تحميلها.
  
يجب تحميل الصورة في البداية ثم تخزينها بشكلٍ مؤقّتٍ قبل أن يتمكّن هذا التابع من استرجاع أبعادها، مما يعني أنه يمكن من حيث المبدأ استخدام هذا التابع لتحميل الصّورة مسبقًا (preload)، غير أنه ليس الأمثل لهذا الغرض، ويمكن في المستقبل أن يُبرمَج بحيث لا يحتاج لتحميل كامل معطيات الصورة. ويفضل أن تحمّل الصور مسبقًا عن طريق واجهة برمجية مستقلة.  
+
يجب تحميل الصورة في البداية، ثمّ تخزينها بشكلٍ مؤقّتٍ قبل تمكُّن هذا التّابع من استرجاع أبعادها، ما يعني أنه يمكن من حيث المبدأ استخدام هذا التابع لتحميل الصّورة مسبقًا (preload)، غير أنّه ليس الأمثل لهذا الغرض، ويمكن في المستقبل أن يُبرمَج بحيث لا يحتاج لتحميل كامل معطيات الصورة. ويفضل أن تحمّل الصور مسبقًا عن طريق واجهة برمجية مستقلة.  
  
لا يعمل مع الصور ذات المصدر الثابت.
+
لا يعمل مع الصّور ذات المصدر الثّابت.
  
 
==== المعاملات ====
 
==== المعاملات ====
 +
{| class="wikitable"
 +
!الاسم
 +
!النوع
 +
!مطلوب
 +
!الوصف
 +
|-
 +
|<code>uri</code>
 +
|سلسلة نصية (string)
 +
|نعم
 +
|موقع الصورة
 +
|-
 +
|<code>headers</code>
 +
|كائن (object)
 +
|نعم
 +
|ترويسة الطلب
 +
|-
 +
|<code>success</code>
 +
|دالة (function)
 +
|نعم
 +
|الدالة التي ستطلب عند إيجاد الصورة بنجاح واستعادة ارتفاعها وعرضها
 +
|-
 +
|<code>failure</code>
 +
|دالة (function)
 +
|لا
 +
|الدالة التي ستطلب عند حدوث خطأ كالفشل في استعادة الصورة
 +
|}
  
=== <code>prefetch()</code> ===
+
=== <code>prefetch()</code>===
Image.prefetch(url);
+
<syntaxhighlight lang="javascript">
يجلب الصّور بشكلٍ مسبقٍ (prefetche) ويخزنها على قرص التخزين المؤقت (disk cache) لتُستخدم فيما بعد.
+
Image.prefetch(url);
 +
</syntaxhighlight>يجلب الصّور مسبقًا (prefetche) ويخزّنها على قرص التّخزين المؤقت (disk cache) لتُستخدم فيما بعد.
  
 
==== المعاملات ====
 
==== المعاملات ====
 +
{| class="wikitable"
 +
!الاسم
 +
!النوع
 +
!مطلوب
 +
!الوصف
 +
|-
 +
|<code>url</code>
 +
|سلسلة نصية (string)
 +
|نعم
 +
|العنوان البعيد لموقع الصورة
 +
|}
  
=== <code>abortPrefetch()</code> ===
+
=== <code>abortPrefetch()</code>===
Image.abortPrefetch(requestId);
+
<syntaxhighlight lang="javascript">
يلغي طلبات الجلب المسبق للصور، ويعمل على منصة Android فقط.
+
Image.abortPrefetch(requestId);
 +
</syntaxhighlight>يلغي طلبات الجلب المسبق للصّور، ويعمل على منصّة Android فقط.
  
 
==== المعاملات ====
 
==== المعاملات ====
 +
{| class="wikitable"
 +
!الاسم
 +
!النوع
 +
!مطلوب
 +
!الوصف
 +
|-
 +
|<code>requestId</code>
 +
|عدد (number)
 +
|نعم
 +
|المعرف ID المعاد من ()prefetch
 +
|}
  
=== <code>queryCache()</code> ===
+
=== <code>queryCache()</code>===
Image.queryCache(urls);
+
<syntaxhighlight lang="javascript">
يتحقق من التخزين المؤقت، ثم يعيد ربطًا (mapping) بين عنوان URL وحالة التخزين المؤقت (cache status) له، مثلًا على القرص <code>disk</code> أم على الذاكرة <code>memory</code>، وإذا لم يوجد عنوان محدد في كتلة الربط تلك، فهذا يعني عدم وجوده في المخزن المؤقت.
+
Image.queryCache(urls);
 +
</syntaxhighlight>يتحقّق من التّخزين المؤقت، ثمّ يعيد ربطًا (mapping) بين عنوان URL وحالة التّخزين المؤقّت (cache status) له، مثلًا على القرص <code>disk</code> أم على الذاكرة <code>memory</code>، وإذا لم يوجد عنوان محدّد في كتلة الربط تلك، فهذا يعني عدم وجوده في المخزن المؤقت.
  
 
==== المعاملات ====
 
==== المعاملات ====
 +
{| class="wikitable"
 +
!الاسم
 +
!النوع
 +
!مطلوب
 +
!الوصف
 +
|-
 +
|<code>urls</code>
 +
|مصفوفة (array)
 +
|نعم
 +
|قائمة عناوين URL لفحص التخزين المؤقت
 +
|}
  
=== <code>resolveAssetSource()</code> ===
+
=== <code>resolveAssetSource()</code>===
Image.resolveAssetSource(source);
+
<syntaxhighlight lang="javascript">
يعيد المرجع المساعد (asset reference) على شكل كائن له الخاصيات <code>uri</code> و <code>width</code> و <code>height</code>.
+
Image.resolveAssetSource(source);
 +
</syntaxhighlight>يعيد المرجع المساعد (asset reference) على شكل كائن له الخاصيّات <code>uri</code>، و<code>width</code>، و<code>height</code>.
  
 
==== المعاملات ====
 
==== المعاملات ====
<blockquote>'''ملاحظة:''' <code>ImageSource</code>هو  كائنٌ من الشكل <code>{ uri: '<http location || file path>' }</code>. </blockquote>
+
{| class="wikitable"
 +
!الاسم
 +
!النوع
 +
!مطلوب
 +
!الوصف
 +
|-
 +
|<code>source</code>
 +
|عدد (number)، كائن (object)
 +
|نعم
 +
|العدد من النوع المبهم الذي تعيده ‪require('./image.jpg')
  
 +
أو الكائن <code>ImageSource</code>
 +
|}
 +
'''ملاحظة:''' <code>ImageSource</code>هو  كائنٌ من الشكل ‪.<code>{ uri: '<http location || file path>' }</code>
 
== مصادر ==
 
== مصادر ==
  
* صفحة Image  في توثيق React Native الرسميّ
+
* [https://facebook.github.io/react-native/docs/image صفحة Image  في توثيق React Native الرسميّ]
 
[[تصنيف:ReactNative]]
 
[[تصنيف:ReactNative]]

مراجعة 11:46، 28 يناير 2021

المكوّن الخاصّ بإظهار مختلف أنواع الصّور في منصّة React، والتي تتضمّن صور الشّبكة وصور المصادر الثّابتة (static resources) والصّور المحلّيّة المؤقّتة والصّور المخزّنة على القرص المحلّي كمعرض الصور.

يبين المثال التّالي كيفيّة جلب الصّور من وسائط التّخزين المحليّة ومن الشّبكة، وكذلك من المعطيات الواردة من :data الخاصّة بعنوان uri، ثم إظهارها.

ملاحظة: يجب تحديد أبعاد الصورة يدويًّا عند جلبها من الشّبكة أو من المصدر data.

أمثلة

  • مثال لمكوِّن دالّة (Function Component)
import React from 'react';
import { View, Image, StyleSheet } from 'react-native';

const styles = StyleSheet.create({
  container: {
    paddingTop: 50,
  },
  tinyLogo: {
    width: 50,
    height: 50,
  },
  logo: {
    width: 66,
    height: 58,
  },
});

const DisplayAnImage = () => {
  return (
    <View style={styles.container}>
      <Image
        style={styles.tinyLogo}
        source={require('@expo/snack-static/react-native-logo.png')}
      />
      <Image
        style={styles.tinyLogo}
        source={{
          uri: 'https://reactnative.dev/img/tiny_logo.png',
        }}
      />
      <Image
        style={styles.logo}
        source={{
          uri:
            'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAAAzCAYAAAA6oTAqAAAAEXRFWHRTb2Z0d2FyZQBwbmdjcnVzaEB1SfMAAABQSURBVGje7dSxCQBACARB+2/ab8BEeQNhFi6WSYzYLYudDQYGBgYGBgYGBgYGBgYGBgZmcvDqYGBgmhivGQYGBgYGBgYGBgYGBgYGBgbmQw+P/eMrC5UTVAAAAABJRU5ErkJggg==',
        }}
      />
    </View>
  );
}

export default DisplayAnImage;
  • مثال لمكوِّن صنف (Class Component)
import React, { Component } from 'react';
import { AppRegistry, View, Image, StyleSheet } from 'react-native';

const styles = StyleSheet.create({
  container: {
    paddingTop: 50,
  },
  tinyLogo: {
    width: 50,
    height: 50,
  },
  logo: {
    width: 66,
    height: 58,
  },
});

class DisplayAnImage extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Image
          style={styles.tinyLogo}
          source={require('@expo/snack-static/react-native-logo.png')}
        />
        <Image
          style={styles.tinyLogo}
          source={{uri: 'https://reactnative.dev/img/tiny_logo.png'}}
        />
        <Image
          style={styles.logo}
          source={{uri: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAAAzCAYAAAA6oTAqAAAAEXRFWHRTb2Z0d2FyZQBwbmdjcnVzaEB1SfMAAABQSURBVGje7dSxCQBACARB+2/ab8BEeQNhFi6WSYzYLYudDQYGBgYGBgYGBgYGBgYGBgZmcvDqYGBgmhivGQYGBgYGBgYGBgYGBgYGBgbmQw+P/eMrC5UTVAAAAABJRU5ErkJggg=='}}
        />
      </View>
    );
  }
}

export default DisplayAnImage;

كما يمكن إضافة تنسيقٍ style للصّورة كما يلي:

  • مثال لمكوِّن دالّة (Function Component)
import React from 'react';
import { View, Image, StyleSheet } from 'react-native';

const styles = StyleSheet.create({
  container: {
    paddingTop: 50,
  },
  stretch: {
    width: 50,
    height: 200,
    resizeMode: 'stretch',
  },
});

const DisplayAnImageWithStyle = () => {
  return (
    <View style={styles.container}>
      <Image
        style={styles.stretch}
        source={require('@expo/snack-static/react-native-logo.png')}
      />
    </View>
  );
}

export default DisplayAnImageWithStyle;
  • مثال لمكوِّن صنف (Class Component)
import React, { Component } from 'react';
import { View, Image, StyleSheet } from 'react-native';

const styles = StyleSheet.create({
  stretch: {
    width: 50,
    height: 200,
    resizeMode: 'stretch'
  }
});

class DisplayAnImageWithStyle extends Component {
  render() {
    return (
      <View>
        <Image
          style={styles.stretch}
          source={require('@expo/snack-static/react-native-logo.png')}
        />
      </View>
    );
  }
}

export default DisplayAnImageWithStyle;

دعم صور GIF وWebP على منصة Android

لا تُدعم الصّور من نوع GIF وWebP افتراضيًّا على منصّة Android عند بناء شفرة أصيلة شخصيّة، لذا يجب إضافة بعض الوحدات الاختياريّة على المسار android/app/build.gradle بما يتوافق مع حاجة التّطبيق.

dependencies {
  // If your app supports Android versions before Ice Cream Sandwich (API level 14)
  implementation 'com.facebook.fresco:animated-base-support:1.3.0'

  // For animated GIF support
  implementation 'com.facebook.fresco:animated-gif:2.0.0'

  // For WebP support, including animated WebP
  implementation 'com.facebook.fresco:animated-webp:2.1.0'
  implementation 'com.facebook.fresco:webpsupport:2.0.0'

  // For WebP support, without animations
  implementation 'com.facebook.fresco:webpsupport:2.0.0'
}

الخاصيات

style

الخاصيّة ImageResizeMode هي من نوع enum، وتُستخدم لتغيير وضع تحجيم الصور، ويتم ضبطها عن طريق خاصيّة التنسيق ResizeMode في المكون Image، ويمكن أن تأخذ إحدى القيم (contain,cover, stretch,center,repeat).

النوع مطلوب
تنسيق (style) لا

ومن خاصيّات التّنسيق أيضًا:

accessible

لتحديد قابليّة الوصول للصّورة، إذ يمكن الوصول إلى الصّورة إذا كانت قيمتها true.

النوع مطلوب المنصة
قيمة منطقية (bool) لا iOS

accessibilityLabel

النّص الذي سيقرؤه تطبيق قارئ الشّاشة (screen reader) عندما يتفاعل المستخدم مع الصّورة.

النوع مطلوب المنصة
سلسلة نصية (string) لا iOS

blurRadius

نصف قطر التّمويه (blur) المطبّق على الصورة.

النوع مطلوب
عدد (number) لا

ملاحظة: يجب أن تكون قيمة blurRadius أكبر من 5 على منصّة IOS.

capInsets

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

النوع مطلوب المنصة
Rect لا iOS

defaultSource

لعرض الصّورة الثّابتة بينما يحمّل مصدر الصّورة.

النوع مطلوب المنصة
كائن، عدد (number, object) لا iOS
عدد (number) لا Android

فعند تمريرها ككائنٍ فسيكون من الشّكل: {uri: string, width: number, height: number, scale: number} حيث:

  • uri: سلسلةٌ نصّيةٌ تمثّل معرِّف مصدر الصورة (resource identifier)، والذي قد يكون مسار الملف المحلّي، أو مصدر الصّورة الثّابت (المغلَّف بالدالة ‪.require('./path/to/image.png'))
  • width، height: يمكن تحديدها عند البناء إذا كانت معروفةً، وتُستخدم لضبط الأبعاد الافتراضيّة للمكوّن <Image/>.
  • scale: تُستخدم لتحديد مقياس رسم (scale) الصورة، والقيمة الافتراضيّة له هي 1.0 والتي تعني أنّ كل بكسل (pixel) من الصورة يقابل نقطة إظهارٍ واحدةٍ DIP.

أمّا عند تمريرها كعددٍ:

  • number: نوع مبهم (Opaque) معاد من قبل شيءٍ ما مثل ‪.require('./image.jpg')

ملاحظة: يتم تجاهل هذه الخاصية أثناء البناء الاختباريّ على منصة Android.

fadeDuration

تعمل على منصة Android فقط، وقيمتها الافتراضية هي 300 ميلي ثانية.

النوع مطلوب المنصة
عدد (number) لا Android

loadingIndicatorSource

تمثّل هذه الخاصية - التي تشبه الخاصّية Source مصدر المستخدم في إظهار مؤشر تحميل الصورة، والذي سيظهَر إلى أن تجهز الصورة للعرض، أي حتى انتهاء تحميلها من الشّبكة.

النوع مطلوب
مصفوفة، عدد (array of ImageSourcePropTypes, number) لا

ملاحظة: يمكنها قبول العدد الذي تعيده ‪.require('./image.jpg')

onError

تُستدعى بالحدث {{nativeEvent: {error} وذلك عند حدوث خطأ في التّحميل.

النوع مطلوب
دالة (function) لا

onLayout

تُستدعى بالحدث {{{nativeEvent: {layout: {x, y, width, height} وذلك عند تغيّر التنسيق.

النوع مطلوب
دالة (function) لا

onLoad

تُستدعى عند اكتمال التّحميل بنجاح.

النوع مطلوب
دالة (function) لا

onLoadEnd

تُستدعى عند اكتمال التّحميل سواء أكان ناجحًا أو فاشلًا.

النوع مطلوب
دالة (function) لا

onLoadStart

تُستدعى عند بدء التحميل، مثال: ‪onLoadStart={(e) => this.setState({loading: true})}

النوع مطلوب
دالة (function) لا

onPartialLoad

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

النوع مطلوب المنصة
دالة (function) لا iOS

onProgress

تُستدعى بالحدث {{nativeEvent: {loaded, total} وذلك عند تقدم التّحميل.

النوع مطلوب المنصة
دالة (function) لا iOS

progressiveRenderingEnabled

تعمل على منصّة Android فقط، وتُستخدم لتمكين تدفّق (streaming) صور JPEG المتقدم. ويمكن زيارة Progressive JPEGs لمزيد من المعلومات.

النوع مطلوب المنصة
قيمة منطقية (bool) لا Android

resizeMethod

تحدّد الطريقة المستخدمة في تغيير أبعاد الصّورة المحمّلة في حال اختلاف أبعادها عن الأبعاد التي ستُعرض بها:

  • auto: وهي الطّريقة الافتراضيّة، وتقوم على التّجريب للاختيار بين الطّريقتين resize، وscale.
  • resize: عمليّةٌ برمجيّةٌ تعالج الصّورة المرمّزة (encoded) في الذّاكرة قبل فكّ ترميزها، ويجب استخدامها بدلًا من scale عندما تكون الصّورة أكبر من العرض.000000000002222
  • scale: ترسم الصّورة مكبّرةً أو مصغّرة، وهي أسرع من الطّريقتين السّابقتين كونها تَستخدم مسرّع الجهاز الرّسومي (usually hardware accelerated )، وتُنتج صورًا ذات جودةٍ أعلى. تستخدَم عندما تكون الصّور أصغر من العرض 000000000000000000002222222 أو أكبر قليلًا.

ويمكن زيارة Resizing لمزيد من المعلومات حول resize، وscale.

النوع مطلوب المنصة
قيمة متعدّدة ‪(enum('auto', 'resize', 'scale')) لا Android

resizeMode

تحدّد الطّريقة التي ستُستخدم لتغيير أبعاد الصّورة الأوّليّة (raw image) في حال اختلاف أبعادها عن أبعاد إطار (frame) العرض0000000000000222222222:

  • cover: وهي الطّريقة الافتراضيّة، حيث تغيّر مقياس رسم (scale) الصّورة بانتظامٍ (يحافظ على نسبة ارتفاع الصّورة إلى عرضها (aspect ratio))، بحيث تصبح أبعاد الصّورة أكبر أو تساوي أبعاد الإطار (بعد طرح الحواشي (padding)).
  • contain: تغيّر مقياس رسم (scale) الصورة بانتظام (يحافظ على نسبة ارتفاع الصّورة إلى عرضها (aspect ratio))، بحيث تصبح أبعاد الصّورة أصغر أو تساوي أبعاد الإطار (بعد طرح الحواشي (padding)).
  • stretch: تغيّر ارتفاع الصورة وعرضها بشكلٍ مستقلٍ (independently)، مما قد يؤدي لتغيير نسبة ارتفاع الصورة إلى عرضها.
  • repeat: تكرر الصورة حتى تغطي كامل إطار العرض مع المحافظة على أبعادها إذا كانت أصغر من الإطار؛ أمّا إذا كانت أكبر منه فستغيّر مقياس رسم الصّورة بانتظام بحيث يحتويها الإطار.
  • center: تضع الصورة في مركز الإطار بحيث تكون أبعادها موازيةً لأبعاد الإطار إذا كانت أصغر منه؛ أمّا إذا كانت أكبر منه فستغيّر مقياس رسم الصّورة بانتظامٍ بحيث يحتويها الإطار.
النوع مطلوب
قيمة متعددة ‪(enum('cover', 'contain', 'stretch', 'repeat', 'center')) لا

source

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

كما يمكن أن تتضمن هذه الخاصيّة العديد من عناوين URL البعيدة مع تحديد العرض، والارتفاع وربّما مقياس الرّسم وغيرها من معاملات URL، فيقوم التّطبيق الأصيل باختيار أفضل uri ليعرضه وذلك اعتمادًا على أبعاد حاوية الصورة (image container)، كما يمكن إضافة الخاصية cache للتحكم بكيفيّة تفاعل الطّلبات الشّبكيّة مع التخزين المحلّيّ المؤقّت (local cache). ويمكن الإطلاع على التحكم بالتخزين المؤقت للصور لمزيد من المعلومات.

صيغ الصّور (format) المدعومة حاليًّا على منصّة Android هي: (png, jpg,jpeg, bmp, gif,webp)، والصيغة psd على منصة iOS. كما تدعم منصة iOS العديد من صيغ الصّور الصّرفة (RAW)، ويمكن الرّجوع إلى توثيق شركة Apple للإطلاع على قائمة الكاميرات المدعومة (وفيما يخص الإصدار iOS 12 فيمكن زيارة support apple.

النوع مطلوب
ImageSourcePropType لا

testID

معرِّف فريد لهذا العنصر يستخدم سكربتات اختبار أتمتة واجهة المستخدم.

التوابع

getSize()

Image.getSize(uri, success, [failure]);

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

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

المعاملات

الاسم النوع مطلوب الوصف
uri سلسلة نصية (string) نعم موقع الصورة
success دالة (function) نعم الدالة التي ستطلب عند إيجاد الصورة بنجاحٍ واستعادة ارتفاعها وعرضها
failure دالة (function) لا الدالة التي ستطلب عند حدوث خطأ كالفشل في استعادة الصورة

getSizeWithHeaders()

Image.getSizeWithHeaders(uri, headers, success, [failure]);

يعيد ارتفاع الصّورة وعرضها بالبكسل قبل إظهارها مع إمكانية إعطاء الترويسات (headers) للطلب، ويمكن أن يفشل عند عدم وجود الصورة أو فشل تحميلها.

يجب تحميل الصورة في البداية، ثمّ تخزينها بشكلٍ مؤقّتٍ قبل تمكُّن هذا التّابع من استرجاع أبعادها، ما يعني أنه يمكن من حيث المبدأ استخدام هذا التابع لتحميل الصّورة مسبقًا (preload)، غير أنّه ليس الأمثل لهذا الغرض، ويمكن في المستقبل أن يُبرمَج بحيث لا يحتاج لتحميل كامل معطيات الصورة. ويفضل أن تحمّل الصور مسبقًا عن طريق واجهة برمجية مستقلة.

لا يعمل مع الصّور ذات المصدر الثّابت.

المعاملات

الاسم النوع مطلوب الوصف
uri سلسلة نصية (string) نعم موقع الصورة
headers كائن (object) نعم ترويسة الطلب
success دالة (function) نعم الدالة التي ستطلب عند إيجاد الصورة بنجاح واستعادة ارتفاعها وعرضها
failure دالة (function) لا الدالة التي ستطلب عند حدوث خطأ كالفشل في استعادة الصورة

prefetch()

Image.prefetch(url);

يجلب الصّور مسبقًا (prefetche) ويخزّنها على قرص التّخزين المؤقت (disk cache) لتُستخدم فيما بعد.

المعاملات

الاسم النوع مطلوب الوصف
url سلسلة نصية (string) نعم العنوان البعيد لموقع الصورة

abortPrefetch()

Image.abortPrefetch(requestId);

يلغي طلبات الجلب المسبق للصّور، ويعمل على منصّة Android فقط.

المعاملات

الاسم النوع مطلوب الوصف
requestId عدد (number) نعم المعرف ID المعاد من ()prefetch

queryCache()

Image.queryCache(urls);

يتحقّق من التّخزين المؤقت، ثمّ يعيد ربطًا (mapping) بين عنوان URL وحالة التّخزين المؤقّت (cache status) له، مثلًا على القرص disk أم على الذاكرة memory، وإذا لم يوجد عنوان محدّد في كتلة الربط تلك، فهذا يعني عدم وجوده في المخزن المؤقت.

المعاملات

الاسم النوع مطلوب الوصف
urls مصفوفة (array) نعم قائمة عناوين URL لفحص التخزين المؤقت

resolveAssetSource()

Image.resolveAssetSource(source);

يعيد المرجع المساعد (asset reference) على شكل كائن له الخاصيّات uri، وwidth، وheight.

المعاملات

الاسم النوع مطلوب الوصف
source عدد (number)، كائن (object) نعم العدد من النوع المبهم الذي تعيده ‪require('./image.jpg')

أو الكائن ImageSource

ملاحظة: ImageSourceهو كائنٌ من الشكل ‪.{ uri: '<http location || file path>' }

مصادر