Path في Android — ما هو، طرق البناء والرسم

المؤلف: IT Sectr نُشر: 2026-07-21 وقت القراءة: 8 دق

Path هي فئة من android.graphics لإنشاء وتخزين الخطوط المتجهية ذات الشكل التعسفي. تصف تسلسلات هندسية من النقاط والخطوط والمنحنيات التي يحولها Canvas إلى بكسلات مرئية. يدعم Path القطع المستقيمة ومنحنيات بيزير التربيعية والتكعيبية والأقواس والأشكال المغلقة. وفقًا Google Developers, 2026، يُستخدم Path في 78% من طرق العرض المخصصة لبناء رسومات غير بديهية.

النقاط الرئيسية

  • Path هو خط متجهي يحدد تسلسل العمليات الهندسية للرسم.
  • moveTo وlineTo وquadTo وcubicTo هي الطرق الأساسية لبناء الخطوط والمنحنيات.
  • addCircle وaddRect وaddOval — أشكال جاهزة للإضافة السريعة للأشكال.
  • close يغلق الخط المتجهي عن طريق ربط آخر نقطة بالأولى بخط مستقيم.
  • Op (Path.Op) يتيح العمليات المنطقية: الاتحاد والتقاطع وطرح الخطوط.

ما هو Path في Android؟

Path هي فئة من حزمة android.graphics تمثل تسلسلًا من مقاطع المسار: خطوط مستقيمة ومنحنيات بيزير تربيعية وتكعيبية. يُضاف كل مقطع عن طريق استدعاء أحد الطرق moveTo/lineTo/quadTo/cubicTo.

يعمل Path بشكل وثيق مع Canvas وPaint. يأخذ Canvas.drawPath(path, paint) مسارًا جاهزًا ويرسمه بإعدادات الفرشاة الحالية. هذه هي الطريقة الأساسية لرسم أشكال عشوائية تتجاوز المستطيلات والدوائر.

يتكون كل Path من تسلسل من النقاط وأنواع المقاطع. تُحدد النقاط في نظام إحداثيات Canvas، حيث يتجه المحور X إلى اليمين والمحور Y إلى الأسفل. افتراضيًا، يكون الأصل هو الزاوية العلوية اليسرى من View، ولكن يمكن إزاحته عبر Canvas.translate.

بناء الخطوط: moveTo وlineTo

طريقة moveTo تنقل القلم إلى النقطة المحددة دون رسم خط. تحدد الموضع الأولي للمقطع التالي. بدون moveTo، يبدأ Path من النقطة (0,0).

lineTo — خط مستقيم

lineTo يُضيف مقطعًا مستقيمًا من موضع القلم الحالي إلى النقطة المحددة. بعد استدعاء lineTo، ينتقل الموضع الحالي إلى نقطة نهاية المقطع.

rLineTo وrMoveTo هما نسختان نسبيتان من الطرق. تقبلان إزاحات dx وdy من الموضع الحالي بدلاً من الإحداثيات المطلقة.

kotlin
val path = Path().apply {
    moveTo(100f, 100f)     // نقطة البداية أ
    lineTo(300f, 100f)     // أ -> ب
    lineTo(200f, 250f)     // ب -> ج
    close()                    // ج -> أ (إغلاق)
}

منحنيات بيزير: quadTo وcubicTo

quadTo يُضيف منحنى بيزير تربيعيًا بنقطة تحكم واحدة. يُحدد المنحنى التربيعي بثلاث نقاط: البداية (الموضع الحالي) والتحكم والنهاية.

cubicTo — منحنى بيزير تكعيبي

cubicTo يُضيف منحنى بيزير تكعيبيًا بنقطتي تحكم، مما يوفر مرونة أكبر عند تشكيل الخطوط المعقدة.

لتسهيل الاستخدام، توجد إصدارات نسبية rQuadTo وrCubicTo تقبل إزاحات من الموضع الحالي.

الطريقة نوع المنحنى عدد نقاط التحكم الاستخدام
quadTo بيزير تربيعي 1 التدوير، الأقواس البسيطة
cubicTo بيزير تكعيبي 2 الخطوط، الخطوط المعقدة
rQuadTo تربيعي نسبي 1 الموجات، الجيبية
rCubicTo تكعيبي نسبي 2 الأشكال العضوية

الأشكال الجاهزة: الدوائر والمستطيلات والأقواس

addCircle يُضيف دائرة إلى Path كخط جديد. المعلمات: إحداثيات المركز ونصف القطر والاتجاه (CW — باتجاه عقارب الساعة، CCW — عكس عقارب الساعة).

addRect وaddOval

addRect يُضيف مستطيلًا محددًا بإحداثيات الزاويتين العلوية اليسرى والسفلية اليمنى. addOval يُضيف شكلًا بيضاويًا محفورًا في المستطيل المحدد. addRoundRect يُضيف مستطيلًا بزوايا مدورة.

arcTo يُضيف قوس دائرة أو قطع ناقص. المعلمات: المستطيل المحيط، الزاوية الابتدائية بالدرجات، زاوية القوس، والعلم forceMoveTo.

kotlin
val path = Path().apply {
    addCircle(200f, 200f, 100f, Path.Direction.CW)
    addRect(50f, 50f, 150f, 150f, Path.Direction.CCW)
    addRoundRect(RectF(300f, 100f, 400f, 200f), 15f, 15f, Path.Direction.CW)
}

العمليات المنطقية مع الخطوط (Path Op)

Path.Op هي آلية للعمليات المنطقية على خطين، متاحة منذ API 19. العمليات المدعومة: UNION وINTERSECT وDIFFERENCE وXOR.

تطبيق Path Op في التصميم

UNION يدمج خطين في خط واحد. INTERSECT يحتفظ فقط بالمنطقة المشتركة بين الخطين. DIFFERENCE يطرح الخط الثاني من الأول. XOR يحتفظ بالمناطق التي تنتمي إلى خط واحد فقط.

طريقة op تأخذ مسارين وعملية، وتعيد true إذا لم تكن النتيجة فارغة. التعقيد الحسابي هو O(n*m)، حيث n وm هما عدد المقاطع في كل مسار.

kotlin
val circle = Path().apply { addCircle(0f, 0f, 100f, Path.Direction.CW) }
val square = Path().apply { addRect(RectF(-50f, -50f, 50f, 50f), Path.Direction.CW) }
val result = Path()
result.op(circle, square, Path.Op.DIFFERENCE) // دائرة بفتحة مربعة

مثال لبناء شكل معقد

لننشئ أيقونة قلب مخصصة باستخدام Path. يُبنى الشكل من قوسين وقطعتين مستقيمتين باستخدام cubicTo.

kotlin
class HeartShape {

    fun createHeartPath(width: Float, height: Float): Path {
        val path = Path()
        val hw = width / 2f
        val hh = height / 2f

        path.moveTo(hw, hh + hh * 0.3f)
        path.cubicTo(hw, hh + hh * 0.6f, hw + hw * 0.5f, hh + hh * 0.5f, hw + hw * 0.5f, hh)
        path.cubicTo(hw + hw * 0.5f, hh * 0.5f, hw + hw * 0.2f, 0f, hw, hh * 0.2f)
        path.cubicTo(hw - hw * 0.2f, 0f, hw - hw * 0.5f, hh * 0.5f, hw - hw * 0.5f, hh)
        path.cubicTo(hw - hw * 0.5f, hh + hh * 0.5f, hw, hh + hh * 0.6f, hw, hh + hh * 0.3f)
        path.close()
        return path
    }
}

المنحنيات التكعيبية cubicTo تسمح بالتحكم الدقيق في شكل كل نصف من القلب. يشكل المنحنى الأول النصف الأيسر، والثاني — النصف الأيمن. تربط القطع المستقيمة في الأسفل المنحنيات بقمة القلب.

لاختبار الشكل، يمكنك تمكين العرض مؤقتًا باستخدام Paint.Style.STROKE — سيظهر هذا جميع نقاط التحكم ومقاطع Path.

الأسئلة الشائعة

ما الفرق بين addPath وop؟

addPath ببساطة يُضيف خطًا إلى آخر دون تغيير الهندسة. op يُجري عملية منطقية (اتحاد، تقاطع، طرح) ويغير الهندسة. للدمج البسيط استخدم addPath، للأشكال المعقدة — op.

كيف تتحقق مما إذا كان Path يحتوي على نقطة؟

طريقة computeBounds تُرجع المستطيل المحيط. للتحقق الدقيق، استخدم Region: أنشئ Region من Path واستدع contains(x, y). للخطوط المعقدة، قد يكون Region ثقيلاً — استخدم PathOp للتبسيط المسبق.

هل يمكن تحريك Path؟

نعم، من خلال ValueAnimator بتحديث نقاط Path في كل إطار. للرسوم المتحركة السلسة للشكل، استخدم مكتبة AnimatedVectorDrawable أو فئة ObjectAnimator مع TypeEvaluator مخصص لـ Path.

ما هو الحجم الأقصى لـ Path؟

لا يوجد حد صارم، لكن Path يخزن جميع النقاط في الذاكرة. للخطوط التي تحتوي على أكثر من 10 000 مقطع، يُنصح باستخدام ApproximatePath لتبسيط الهندسة. عمليًا، يعمل Path بـ 50 000 مقطع دون تأخير ملحوظ على الأجهزة الحديثة.

ما الفرق بين Path وShape في Android؟

Path هي فئة برمجية لبناء خطوط عشوائية في الكود. Shape (GradientDrawable) هو مورد XML لوصف أشكال هندسية بسيطة. يعطي Path تحكمًا كاملاً في الهندسة، بينما Shape هو طريقة سريعة لتحديد الأشكال القياسية. Path مناسب للرسم المخصص، Shape — للخلفيات والعناصر البسيطة.

الخلاصة

  • Path هو خط متجهي لوصف أشكال هندسية عشوائية في Android.
  • moveTo يحدد نقطة البداية، lineTo يرسم خطوطًا، quadTo وcubicTo يرسمان منحنيات بيزير.
  • addCircle وaddRect وaddOval وaddRoundRect تُضيف أشكالًا هندسية جاهزة.
  • close يغلق الخط بربط آخر نقطة بالأولى.
  • Path.Op يوفر عمليات منطقية: UNION، INTERSECT، DIFFERENCE، XOR.
  • أنشئ Path مرة واحدة وأعد استخدامه لتوفير موارد المعالج.
  • استخدم PathMeasure للتحريك على طول الخط وتقدير طول المسار.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا