البرمجة

التعامل مع القياسات في Xamarin

تطبيقات عمليّة حول التعامل مع القياسات في Xamarin

تُعد منصة Xamarin واحدة من أبرز بيئات التطوير عبر الأنظمة التي تتيح إنشاء تطبيقات جوال لأنظمة Android وiOS باستخدام قاعدة شفرة واحدة بلغة #C. من بين التحديات الرئيسية التي تواجه المطورين في هذا السياق هو التعامل مع القياسات ووحدات الأبعاد (Measurements) ضمن واجهات المستخدم، حيث يتعين مراعاة اختلاف أحجام الشاشات، الكثافات النقطية (DPI)، الاتجاهات، وأنظمة التشغيل المختلفة.

يتناول هذا المقال التطبيقات العملية الأكثر شيوعًا المتعلقة بالقياسات في Xamarin وكيفية التعامل معها بشكل احترافي لضمان واجهة متجاوبة (Responsive) وموحدة عبر مختلف الأجهزة والمنصات.


أهمية التعامل السليم مع القياسات في تطبيقات الجوال

يتفاوت حجم الشاشة وكثافتها بين الأجهزة، ما يجعل من الضروري كتابة واجهات ديناميكية تتجاوب مع هذه الاختلافات. الإهمال في هذا الجانب يؤدي إلى:

  • عرض غير متناسق للعناصر.

  • مشاكل في القابلية للاستخدام.

  • صعوبة في الوصول وتجربة مستخدم سيئة.

لذلك، من الضروري التعامل بدقة مع وحدات القياس، خاصة عند استخدام Xamarin.Forms أو Xamarin.Native.


وحدات القياس في Xamarin

Xamarin يدعم عدة أنواع من وحدات القياس التي تختلف بحسب النظام الأساسي. من أشهر هذه الوحدات:

وحدة القياس الوصف
Pixels (px) الوحدة الأدنى للقياس، وهي خاصة بكل جهاز وتعتمد على الكثافة.
Device Independent Units (dp/dip) وحدة مستقلة عن كثافة الجهاز، تستخدم لضمان التناسق بين الأجهزة.
Points (pt) وحدة قياس تستخدم بشكل رئيسي في iOS، حيث تساوي 1/72 إنش.
Percentage (%) تستخدم في بعض الإطارات مثل Grid أو RelativeLayout لتحديد الأبعاد.

التعامل مع القياسات في Xamarin.Forms

في Xamarin.Forms، تُستخدم وحدات مستقلة عن الجهاز (Device Independent Units) بشكل افتراضي، ما يجعل التصميم أكثر استجابة بين الأنظمة المختلفة. إلا أن فهم آليات العمل مع Layout Options وSize Allocations ضروري لضبط القياسات بدقة.

1. استخدام LayoutOptions

تُستخدم لتحديد موضع العنصر داخل الحاوية الأبوية:

csharp
new Label { Text = "مرحباً", HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Start }

هذه الخيارات لا تحدد الأبعاد مباشرة ولكنها تتحكم في التمركز والتمدد.

2. استخدام WidthRequest و HeightRequest

يتم استخدام هذه الخاصيات لتحديد أبعاد العنصر بشكل صريح:

csharp
new BoxView { Color = Color.Red, WidthRequest = 100, HeightRequest = 50 }

القيمة المحددة يتم تفسيرها كوحدة مستقلة عن الكثافة (Device Independent Units).


استخدام القياسات النسبية

يوفر RelativeLayout و Grid في Xamarin.Forms طريقة مرنة لتحديد الأبعاد والمواقع النسبية للعناصر.

1. RelativeLayout

يسمح بتحديد الأبعاد بشكل نسبي من خلال Constraint.RelativeToParent أو Constraint.RelativeToView:

csharp
var layout = new RelativeLayout(); var box = new BoxView { Color = Color.Blue }; layout.Children.Add( box, Constraint.RelativeToParent(parent => parent.Width * 0.5), Constraint.RelativeToParent(parent => parent.Height * 0.3), Constraint.RelativeToParent(parent => parent.Width * 0.3), Constraint.RelativeToParent(parent => parent.Height * 0.2) );

2. Grid Layout

يتيح استخدام الأعمدة والصفوف، مع تقسيمها إلى نسب:

xml
<Grid> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="2*" /> Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*" /> Grid.ColumnDefinitions> <Label Grid.Row="0" Grid.Column="0" Text="الاسم:" /> <Entry Grid.Row="0" Grid.Column="1" /> Grid>

الاستجابة لتغييرات حجم الشاشة (Responsive UI)

يجب على المطورين تضمين تعليمات برمجية لتحديد سلوك التطبيق عند تدوير الجهاز أو تغيير حجم الشاشة. في Xamarin.Forms، يمكن استخدام الحدث SizeChanged:

csharp
this.SizeChanged += (s, e) => { if (Width > Height) { // الشاشة في الوضع الأفقي } else { // الشاشة في الوضع العمودي } };

كما يمكن استخدام DeviceDisplay.MainDisplayInfo لقراءة الكثافة وحجم الشاشة.


التعامل مع DPI (الكثافة النقطية)

كثافة الشاشة تؤثر على عدد البكسلات التي تمثل وحدة معينة. Xamarin يسمح بالحصول على معلومات الكثافة من خلال مكتبة Xamarin.Essentials:

csharp
var density = DeviceDisplay.MainDisplayInfo.Density;

ويمكن استخدامها لضبط الأحجام ديناميكيًا:

csharp
double desiredSize = 50 * density;

قياسات الصور والعناصر الرسومية

عند إدراج صور أو رموز، من المهم اختيار الأحجام المناسبة لكل كثافة شاشة:

DPI (Density) اسم المجلد حجم الصورة (مثال)
ldpi drawable-ldpi 36×36 px
mdpi drawable-mdpi 48×48 px
hdpi drawable-hdpi 72×72 px
xhdpi drawable-xhdpi 96×96 px
xxhdpi drawable-xxhdpi 144×144 px
xxxhdpi drawable-xxxhdpi 192×192 px

في Xamarin.Android، يجب وضع الصور في مجلداتها المناسبة حسب الكثافة. أما في Xamarin.Forms، يمكن استخدام مجلد Resources مع تسميات حسب المنصة.


استخدام OnPlatform لضبط القياسات بحسب النظام

يسمح OnPlatform بتحديد قيم مختلفة لخصائص القياس حسب نظام التشغيل:

xaml

هذا يضمن تجربة مستخدم موحدة تلائم خصائص كل نظام.


دعم الشاشات عالية الدقة

من المهم اختبار التطبيقات على أجهزة بدقة عالية. يجب التأكد من:

  • ضبط الصور حسب الكثافة.

  • استخدام وحدات مستقلة عن الجهاز.

  • اختبار العناصر باستخدام محاكيات (emulators) ذات دقة مختلفة.


ممارسات موصى بها في التعامل مع القياسات

  • عدم استخدام الأبعاد الثابتة بشكل مفرط إلا عند الضرورة القصوى.

  • الاعتماد على القياسات النسبية لضمان التناسق.

  • استخدام الأدوات مثل FlexLayout و Grid للحصول على استجابة أفضل.

  • دراسة كثافة الشاشة وحجمها قبل تحديد القياسات.

  • اعتماد تصميم واجهة متجاوبة ديناميكية (Adaptive UI).


التعامل مع القياسات في Xamarin.Android و Xamarin.iOS (Native)

Xamarin.Android

في التطبيقات الأصلية على Android، يمكن استخدام الوحدات مثل dp، sp، وpx مباشرة داخل ملفات XML:

xml
<TextView android:layout_width="100dp" android:textSize="16sp" />

ولبرمجياً:

csharp
var pixels = TypedValue.ApplyDimension( ComplexUnitType.Dip, 100, Resources.DisplayMetrics);

Xamarin.iOS

في iOS، يتم العمل بنظام النقاط (points). على سبيل المثال، شاشة Retina كثافتها 2x يعني أن كل نقطة تساوي 2 بكسل:

csharp
var label = new UILabel { Frame = new CoreGraphics.CGRect(0, 0, 200, 50) };

اختبار القياسات وتعديلها باستخدام أدوات التصميم

يمكن استخدام أدوات التصميم المدمجة في Visual Studio مثل:

  • Live Visual Tree

  • XAML Hot Reload

  • Device Previewer

وذلك لضبط القياسات مباشرة ومعاينتها أثناء التطوير.


خلاصة القياسات في Xamarin

في بيئة تطوير متعددة المنصات مثل Xamarin، يُعد التعامل مع القياسات من الجوانب المحورية في نجاح تجربة المستخدم. يتطلب الأمر فهماً دقيقاً لآلية عرض العناصر، الكثافة النقطية، استجابات الشاشة، وأفضل الممارسات الخاصة بالتخطيط والتنسيق.

العمل على واجهات مرنة (Flexible Layouts) باستخدام وحدات مستقلة عن الجهاز، وتوظيف الأدوات النسبية مثل Grid و RelativeLayout، والتكيف مع اختلافات الأنظمة عبر OnPlatform، كل ذلك يشكل منهجية متكاملة للتعامل الذكي والعملي مع القياسات في Xamarin.


المراجع: