Interpolator — ما هو، منحنيات الاستيفاء في Android

المؤلف: IT Sectr نُشر: 2026-03-02 وقت القراءة: 8 دق
Interpolator — مكون من Android Animation Framework يحدد المنحنى الرياضي لتغير قيمة الرسوم المتحركة بمرور الوقت. بدلاً من الحركة الخطية (يتحرك الكائن بسرعة ثابتة)، يسمح Interpolator بتسريع أو إبطاء أو تغيير الرسوم المتحركة بشكل دوري، مما يخلق سلوكاً طبيعياً. يوفر Android 9 منحنيات استيفاء مدمجة: AccelerateInterpolator، DecelerateInterpolator، AccelerateDecelerateInterpolator، AnticipateInterpolator، OvershootInterpolator، BounceInterpolator، CycleInterpolator، LinearInterpolator و PathInterpolator. وفقاً لوثائق مطوري Android، فإن استخدام Interpolator غير الخطي يقلل وقت الرسوم المتحركة المدرك بنسبة 25–40٪ — حيث يرى المستخدم الاستجابة أكثر سلاسة واستجابة. في IT Sectr نستخدم AccelerateDecelerateInterpolator لظهور العناصر و OvershootInterpolator لأزرار الإجراءات.

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

  • Interpolator — دالة رياضية تحول التقدم الخطي للرسوم المتحركة (0→1) إلى منحنى سرعة غير خطي.
  • 9 منحنيات استيفاء مدمجة في Android: من Linear إلى Bounce — تغطي 90% من سيناريوهات الرسوم المتحركة النموذجية.
  • PathInterpolator (API 21+) يسمح بتحديد منحنى Bezier عشوائي بنقطتي تحكم.
  • TimeInterpolator — واجهة لإنشاء منحنيات استيفاء مخصصة بطريقة getInterpolation().
  • AccelerateDecelerateInterpolator — منحنى متماثل: تسارع في البداية، تباطؤ في النهاية، الخيار الأكثر شمولاً.

ما هو Interpolator؟

Interpolator — واجهة في Android تقوم بتعيين القيمة الكسرية لتقدم الرسوم المتحركة (من 0.0 إلى 1.0) إلى قيمة فعلية بسرعة معدلة. إذا استمرت الرسوم المتحركة 300 مللي ثانية، يقوم النظام باستدعاء Interpolator لكل إطار، مرراً التقدم الحالي. يعيد Interpolator قيمة معدلة — على سبيل المثال، مع AccelerateInterpolator عند 50% من الوقت، تكون الرسوم المتحركة قد قطعت ~25% فقط من المسار، محاكية التسارع.

رياضياً، يمكن تمثيل Interpolator كدالة f(t)، حيث t هو الوقت المعياري [0, 1]، و f(t) هي القيمة المعيارية [0, 1] (أو أوسع لـ Overshoot/Bounce). يعيد LinearInterpolator f(t) = t — يتحرك الكائن بسرعة ثابتة. يقارب AccelerateInterpolator f(t) = t²، ويقارب DecelerateInterpolator f(t) = 1 − (1 − t)²، مما يخلق بداية أو نهاية سلسة. في Android Animation Framework، يتم تطبيق Interpolator على كل من ValueAnimator و ObjectAnimator و ViewPropertyAnimator، مما يوفر نهجاً موحداً للتحكم في السرعة على جميع المستويات.

منحنيات الاستيفاء المدمجة في Android

يقدم Android 9 منحنيات استيفاء مدمجة، لكل منها نموذجها الرياضي الخاص. يحدد اختيار المنحنى طابع الرسوم المتحركة: الفيزيائية (Bounce)، المرونة (Overshoot) أو النعومة (AccelerateDecelerate).

المنحنى الرياضيات حالة الاستخدام
LinearInterpolator f(t) = t مؤشرات التقدم، النص المتحرك
AccelerateInterpolator f(t) = tⁿ (n=2) عنصر يغادر الشاشة، يظهر من الأسفل
DecelerateInterpolator f(t) = 1 − (1 − t)ⁿ جسم يسقط، يدخل من الأعلى مع تباطؤ
AccelerateDecelerateInterpolator تقريب cos عام، ظهور/اختفاء العناصر
AnticipateInterpolator تكعيبية مع تراجع دخول نابض — يتراجع الجسم قليلاً قبل البدء
OvershootInterpolator تكعيبية مع تجاوز زر إجراء — يتجاوز قليلاً الموضع المستهدف
AnticipateOvershootInterpolator مزيج من Anticipate + Overshoot بطاقات — تراجع + تجاوز مع عودة
BounceInterpolator ارتدادات مخمدة كرة، عنصر يسقط على سطح
PathInterpolator Bezier تكعيبية (نقطتي تحكم) منحنيات مخصصة لنظام التصميم

كل منحنى استيفاء له إعلان XML في res/interpolator/ وفئة Kotlin في حزمة android.view.animation. AccelerateDecelerateInterpolator هو الأكثر استخداماً: منحنيه يشبه دالة التسهيل ease-in-out في CSS. لتطبيقات Android مع Material Design، يُوصى باستخدام OvershootInterpolator لأزرار الإجراءات العائمة (FAB) — فهو يخلق تأثير "ارتداد" عند الظهور.

PathInterpolator: المنحنيات المخصصة

PathInterpolator — منحنى استيفاء يعتمد على منحنى Bezier، محدد عبر كائن Path. متاح منذ API 21 (Android 5.0). يسمح بتصميم منحنى السرعة بصرياً — يصمم المصمم المنحنى، وينقله المطور إلى الكود عبر إحداثيات نقاط التحكم. يتم دعم Bezier التكعيبية فقط (نقطتي تحكم C1، C2).

منحنى PathInterpolator يبدأ دائماً من النقطة (0,0) وينتهي عند (1,1). تحدد نقاط التحكم الشكل: (x1, y1) — نقطة البداية، (x2, y2) — نقطة النهاية. يجب أن تكون قيم x في النطاق [0,1] — وهذا يضمن الرتابة بمرور الوقت. يمكن أن تخرج قيم y عن [0,1] — وهذا يخلق تأثير تجاوز أو تراجع. على سبيل المثال، يستخدم Material Design القياسي منحنى fast-out-slow-in مع نقاط تحكم (0.4, 0.0, 0.2, 1.0). في IT Sectr نبني PathInterpolators مخصصة لكل نظام تصميم — وهذا يضمن اتساق الرسوم المتحركة عبر جميع الشاشات.

إنشاء Interpolator خاص بك

إذا لم تغطِ منحنيات الاستيفاء المدمجة السيناريو الخاص بك، يسمح Android بإنشاء منحنى مخصص عبر تطبيق واجهة TimeInterpolator. الطريقة الوحيدة هي getInterpolation(input: Float): Float. Input هو التقدم الحالي للرسوم المتحركة من 0 إلى 1؛ output هو القيمة المعدلة. يمكن أن يخرج output عن [0,1] لتأثيرات التجاوز أو الارتداد.

منحنيات الاستيفاء المخصصة النموذجية: تأثير ارتداد مخمد (يتجاوز 1.0 ويعود)، تأثير مرن (تخميد جيبي)، منحنى استيفاء متدرج (قفزات منفصلة). يمكن أيضاً تعريف منحنيات الاستيفاء المخصصة عبر XML باستخدام العلامة <interpolator> وتحديد الفئة. يحتوي Android Studio على معاينة مدمجة لـ Interpolator في Layout Inspector — تعرض المنحنى الفعلي للمنحنى المحدد، مما يبسط التصحيح.

أمثلة برمجية بلغة Kotlin

مثال 1: AccelerateDecelerateInterpolator مع ValueAnimator

رسوم متحركة أساسية لتكبير الزر باستخدام منحنى استيفاء متماثل. يغير ValueAnimator القيمة من 1.0 إلى 1.2 والعكس، ويجعل AccelerateDecelerateInterpolator الحركة سلسة.

kotlin
import android.animation.ValueAnimator
import android.view.animation.AccelerateDecelerateInterpolator
import android.view.View

fun View.pulseAnimation() {
    ValueAnimator.ofFloat(1.0f, 1.2f).apply {
        duration = 300
        interpolator = AccelerateDecelerateInterpolator()
        repeatCount = 1
        repeatMode = ValueAnimator.REVERSE

        addUpdateListener { animator ->
            val scale = animator.animatedValue as Float
            this@pulseAnimation.scaleX = scale
            this@pulseAnimation.scaleY = scale
        }

        start()
    }
}

AccelerateDecelerateInterpolator يخلق تسارعاً سلساً في البداية وتباطؤاً سلساً في النهاية. يكرر وضع REVERSE الرسوم المتحركة في الاتجاه المعاكس، مما يخلق تأثير نبض. يُستخدم هذا النمط لأزرار الإجراءات، لجذب انتباه المستخدم إلى عنصر واجهة رئيسي.

مثال 2: PathInterpolator بمنحنى مخصص

منحنى مخصص مع تأثير تجاوز — يتجاوز الكائن الموضع المستهدف بنسبة 10% ويعود. تحدد نقاط التحكم (0.4, 0.0, 0.6, 1.3) دخولاً متسارعاً مع تجاوز.

kotlin
import android.animation.ObjectAnimator
import android.graphics.Path
import android.view.animation.PathInterpolator
import android.view.View

fun View.slideWithOvershoot() {
    val path = Path().apply {
        cubicTo(0.4f, 0.0f, 0.6f, 1.3f, 1.0f, 1.0f)
    }
    val interpolator = PathInterpolator(path)

    ObjectAnimator.ofFloat(this, "translationY", 200f, 0f).apply {
        duration = 400
        interpolator = interpolator
        start()
    }
}

PathInterpolator يقبل Path بمنحنى Bezier تكعيبي. في المثال، "يتجاوز" العنصر الموضع المستهدف (y=1.3 عند 60% من الوقت) ويعود إلى الموضع النهائي. يجب أن يكون Path رتيباً تماماً على طول المحور x، وإلا ستتحرك الرسوم المتحركة للخلف. للتحقق، استخدم Layout Inspector في Android Studio.

مثال 3: BounceInterpolator مخصص

منحنى استيفاء مخصص مع تأثير ارتداد مخمد. تنفيذ عبر TimeInterpolator بأربع دورات تخميد.

kotlin
import android.animation.TimeInterpolator

class DampedBounceInterpolator : TimeInterpolator {

    private val cycles = 4
    private val damping = 0.85f

    override fun getInterpolation(input: Float): Float {
        val t = input * cycles
        val decay = Math.pow(damping.toDouble(), cycles.toDouble()).toFloat()
        val peak = t - (Math.floor(t.toDouble())).toFloat()
        val bounce = Math.sin(peak * Math.PI).toFloat()
        return 1f - bounce * decay * (1f - input)
    }
}

DampedBounceInterpolator المخصص يخلق 4 ارتدادات مخمدة بمعامل تخميد 0.85. تأخذ طريقة getInterpolation مدخلاً خطياً وتعيد قيمة بتأثير "نابض". في IT Sectr نستخدم منحنى الاستيفاء هذا لرسوم متحركة لظهور الإشعارات — يخلق الارتداد إحساساً بالفيزيائية ويجذب الانتباه.

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

كيف يختلف AccelerateDecelerateInterpolator عن PathInterpolator؟

AccelerateDecelerateInterpolator يخلق منحنى متماثل — يتسارع الكائن في البداية ويتباطأ في النهاية. يسمح PathInterpolator بتحديد منحنى عشوائي عبر Path بنقطة تحكم (Bezier تكعيبية). للرسوم المتحركة المخصصة ذات السلوك غير المتماثل (مثلاً، بداية سريعة + نهاية بطيئة)، استخدم PathInterpolator مع نقاط تحكم (0.2, 0.8, 0.4, 1.0).

هل يمكنني إنشاء Interpolator خاص بي في Android؟

نعم، قم بتطبيق واجهة TimeInterpolator وتجاوز طريقة getInterpolation(input: Float): Float. Input هو قيمة كسرية من 0 إلى 1 (تقدم الرسوم المتحركة)، output هو القيمة الفعلية. على سبيل المثال، يتم تنفيذ تأثير الارتداد بإرجاع قيم أكبر من 1 أو أقل من 0 لسلوك نابض. سجل منحنى الاستيفاء عبر علامة XML أو استخدمه مباشرة في الكود.

هل PathInterpolator متاح على جميع إصدارات Android؟

تمت إضافة PathInterpolator في API 21 (Android 5.0 Lollipop). للإصدارات القديمة، استخدم AccelerateDecelerateInterpolator أو TimeInterpolator مخصص. يدعم PathInterpolator فقط منحنيات Bezier التكعيبية بنقطتي تحكم — الخطوط المستقيمة والمنحنيات التربيعية قد تعطي استيفاء غير صحيح. للتوافق مع الإصدارات السابقة، استخدم AccelerateDecelerateInterpolator كبديل.

أي منحنى استيفاء يوصي به Material Design؟

يوصي Material Design 3 بمنحنى fast-out-slow-in بنقاط تحكم (0.4, 0.0, 0.2, 1.0) لظهور العناصر، linear-out-slow-in (0.0, 0.0, 0.2, 1.0) للاختفاء، fast-out-linear-in (0.4, 0.0, 1.0, 1.0) للحركة. في Android، هذه المنحنيات مطبقة في فئة FastOutSlowInInterpolator من مكتبة Material Components.

هل يؤثر Interpolator على أداء الرسوم المتحركة؟

بأقل قدر. منحنيات الاستيفاء المدمجة تنفذ عملية رياضية واحدة لكل إطار — العبء غير ملحوظ. منحنيات الاستيفاء المخصصة ذات الحسابات الثقيلة (علم المثلثات، الحلقات) قد تسبب micro-jank على الأجهزة الضعيفة. قم بالتحسين عبر الحساب المسبق للقيم في المنشئ أو استخدم TimeInterpolator مع التخزين المؤقت.

الخلاصة

  • Interpolator — دالة رياضية تحول التقدم الخطي للرسوم المتحركة إلى منحنى سرعة غير خطي، مما يجعل الحركة طبيعية.
  • 9 منحنيات استيفاء مدمجة في Android تغطي 90% من السيناريوهات — من الحركة الخطية إلى الارتدادات الفيزيائية.
  • PathInterpolator (API 21+) يحدد منحنى Bezier مخصص بنقطتي تحكم للتحكم الدقيق في الرسوم المتحركة.
  • TimeInterpolator — واجهة لإنشاء منحنيات استيفاء مخصصة برياضيات عشوائية.
  • Material Design يوصي بـ fast-out-slow-in للظهور، linear-out-slow-in لاختفاء العناصر.
  • AccelerateDecelerateInterpolator — خيار شامل للرسوم المتحركة المتماثلة ببداية ونهاية سلسة.
  • منحنيات الاستيفاء المخصصة ذات الارتدادات المخمدة تخلق سلوكاً فيزيائياً للإشعارات والعناصر التفاعلية.

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

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

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

اقرأ أيضًا