تطبيقات عمليّة حول التعامل مع القياسات في 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
تُستخدم لتحديد موضع العنصر داخل الحاوية الأبوية:
csharpnew Label
{
Text = "مرحباً",
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.Start
}
هذه الخيارات لا تحدد الأبعاد مباشرة ولكنها تتحكم في التمركز والتمدد.
2. استخدام WidthRequest و HeightRequest
يتم استخدام هذه الخاصيات لتحديد أبعاد العنصر بشكل صريح:
csharpnew BoxView
{
Color = Color.Red,
WidthRequest = 100,
HeightRequest = 50
}
القيمة المحددة يتم تفسيرها كوحدة مستقلة عن الكثافة (Device Independent Units).
استخدام القياسات النسبية
يوفر RelativeLayout و Grid في Xamarin.Forms طريقة مرنة لتحديد الأبعاد والمواقع النسبية للعناصر.
1. RelativeLayout
يسمح بتحديد الأبعاد بشكل نسبي من خلال Constraint.RelativeToParent أو Constraint.RelativeToView:
csharpvar 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:
csharpthis.SizeChanged += (s, e) =>
{
if (Width > Height)
{
// الشاشة في الوضع الأفقي
}
else
{
// الشاشة في الوضع العمودي
}
};
كما يمكن استخدام DeviceDisplay.MainDisplayInfo لقراءة الكثافة وحجم الشاشة.
التعامل مع DPI (الكثافة النقطية)
كثافة الشاشة تؤثر على عدد البكسلات التي تمثل وحدة معينة. Xamarin يسمح بالحصول على معلومات الكثافة من خلال مكتبة Xamarin.Essentials:
csharpvar density = DeviceDisplay.MainDisplayInfo.Density;
ويمكن استخدامها لضبط الأحجام ديناميكيًا:
csharpdouble 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" />
ولبرمجياً:
csharpvar pixels = TypedValue.ApplyDimension(
ComplexUnitType.Dip,
100,
Resources.DisplayMetrics);
Xamarin.iOS
في iOS، يتم العمل بنظام النقاط (points). على سبيل المثال، شاشة Retina كثافتها 2x يعني أن كل نقطة تساوي 2 بكسل:
csharpvar 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.
المراجع:
-
Xamarin Documentation – Layouts and Device Units: https://learn.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/
-
Xamarin.Essentials – Device Display: https://learn.microsoft.com/en-us/xamarin/essentials/main-display-info

