Easing: esensya, mga function ng paglambot sa mobile animation

May-akda: IT Sectr Nai-publish: 2026-03-02 Oras ng pagbabasa: 8 min
Easing (function ng paglambot) — isang mathematical curve na tumutukoy sa bilis ng pagbabago ng parameter ng animation sa paglipas ng panahon. Sa halip na linear na pare-parehong pinabilis na paggalaw, ang easing ay ginagaya ang pisikal na pag-uugali: ang isang bagay ay maaaring bumilis (ease-in), bumagal (ease-out), o gawin ang pareho (ease-in-out). Sa iOS, ang easing ay ipinapatupad sa pamamagitan ng klase na CAMediaTimingFunction (Core Animation) at SwiftUI modifiers (Animation.easeInOut). Sa Android — sa pamamagitan ng PathInterpolator at TimeInterpolator. Ayon sa dokumentasyon ng Apple Developer, ang tamang napiling easing curve ay nagbabawas ng napapansing oras ng animation ng 20–35% nang hindi binabago ang aktwal na tagal. Sa IT Sectr, na-standardize namin ang ease-in-out curve (0.42, 0.0, 0.58, 1.0) bilang corporate standard para sa lahat ng mobile project.

Mga pangunahing punto

  • Easing — function ng bilis ng animation na ginagaya ang pisikal na paggalaw: pagbilis, pagbagal, o kombinasyon.
  • CAMediaTimingFunction — klase ng iOS Core Animation na may 5 paunang natukoy na curve at custom na cubic Bézier.
  • SwiftUI Animation — mga modifier na .easeIn, .easeOut, .easeInOut, .spring at .timingCurve para sa declarative easing.
  • PathInterpolator — analogo ng easing sa Android na may cubic Bézier curve sa pamamagitan ng dalawang control point.
  • Cubic Bézier — ang universal na format para sa pagtukoy ng easing curve, karaniwan para sa iOS, Android at web.

Ano ang Easing?

Easing (function ng paglambot) — isang mathematical function na f(t) na nagmamapa ng linear na takbo ng oras t ∈ [0,1] sa isang non-linear na halaga ng animation. Kung ang animation ay nagbabago ng posisyon ng isang bagay mula A hanggang B sa loob ng 500 ms, tinutukoy ng easing kung paano gumagalaw ang bagay sa pagitan ng mga puntong ito sa bawat sandali ng oras. Ang linear easing (f(t) = t) ay nangangahulugang pare-pareho ang bilis — ang bagay ay gumagalaw nang mekanikal. Ang non-linear easing — natural: ang bagay ay bumibilis (ease-in), bumagal (ease-out), o may makinis na simula at wakas (ease-in-out).

Ang mga function ng easing ay inilalarawan ng cubic Bézier curves (Cubic Bézier), kung saan ang X axis ay normalized na oras at ang Y axis ay normalized na pag-unlad. Dalawang control point (P1, P2) ang tumutukoy sa hugis ng curve. Ang mga standard curve ay itinakda ng CSS specification: ease (0.25, 0.1, 0.25, 1.0), ease-in (0.42, 0.0, 1.0, 1.0), ease-out (0.0, 0.0, 0.58, 1.0), ease-in-out (0.42, 0.0, 0.58, 1.0). Ang parehong mga halaga ay ginagamit sa CAMediaTimingFunction sa iOS at PathInterpolator sa Android. Ayon sa mga alituntunin ng Material Design Motion, ang mga easing curve ay dapat tumugma sa konteksto: para sa paglitaw — ease-out (mabilis na simula), para sa paglaho — ease-in (mabilis na wakas).

Easing sa iOS: CAMediaTimingFunction

Sa iOS, ang pangunahing gawain sa easing ay ginagawa sa pamamagitan ng klase na CAMediaTimingFunction mula sa Core Animation. Ito ay tumatanggap ng cubic Bézier curve sa anyo ng dalawang control point (c1x, c1y, c2x, c2y) at inilalapat sa CAAnimation (CABasicAnimation, CAKeyframeAnimation). Ang CAMediaTimingFunction ay sumusuporta sa 5 paunang natukoy na function: linear, easeIn, easeOut, easeInEaseOut, at default (katumbas ng easeInEaseOut).

Ang CAMediaTimingFunction ay gumagana sa antas ng CALayer — ang animation ay isinasagawa sa isang hiwalay na proseso, ang render server, na ginagarantiyahan ang 60fps kahit na sa mga kumplikadong pagbabago. Para sa animation ng mga property ng UIView (frame, alpha, transform), ang UIKit ay gumagamit ng UIView.animate na may parameter na options: .curveEaseInOut, na sa loob din ay lumilikha ng CAMediaTimingFunction na may kaukulang curve. Sa iOS 17+, idinagdag ang UIViewAnimationCurve.custom na may BlockParameters para sa custom na Bézier — inaalis nito ang pangangailangan na magsulat ng sariling CAAnimation. Ang CAMediaTimingFunction ay ginagamit din sa UIKit Dynamics at UIScrollView para sa deceleration (UIScrollViewDecelerationRate).

Easing sa SwiftUI

Sa SwiftUI, ang easing ay tinutukoy sa pamamagitan ng istraktura na Animation na may mga modifier na .easeIn, .easeOut, .easeInOut, .spring at .interpolatingSpring. Hindi tulad ng UIKit kung saan ang animation ay procedural (beginAnimations/commitAnimations), ang SwiftUI ay gumagamit ng declarative approach: ang animation ay isang property ng estado na nagbabago at ang framework mismo ang tumutukoy kung paano i-animate ang paglipat.

Ang modifier na .timingCurve(c0x, c0y, c1x, c1y) ay direktang tumatanggap ng mga control point ng cubic Bézier — ito ang kumpletong analogo ng CAMediaTimingFunction. Ang SwiftUI Animation ay sumusuporta sa paunang natukoy na mga curve bilang static properties: ang Animation.easeInOut ay katumbas ng ease-in-out (0.42, 0.0, 0.58, 1.0). Para sa spring animation, ginagamit ang Animation.spring(response:dampingFraction:blendDuration), kung saan ang dampingFraction < 1 ay lumilikha ng spring effect na may paghina. Sa WWDC 2023, ipinakilala ng Apple ang Animation.keyframes — frame-by-frame animation na may custom na easing sa bawat key frame, na nagbibigay ng buong kontrol sa trajectory.

Easing sa Android: PathInterpolator

Sa Android, ang easing ay ipinapatupad sa pamamagitan ng PathInterpolator (API 21+) — isang klase na tumatanggap ng Path object na may cubic Bézier curve. Ang mga control point ay tinutukoy sa pamamagitan ng Path.cubicTo(x1, y1, x2, y2, x3, y3), kung saan ang (x1,y1) ay unang control point, (x2,y2) ay pangalawa, (x3,y3) ay endpoint (palaging 1,1). Ang PathInterpolator ay kinakailangan kung kailangan ng custom na curve; para sa mga standard na sitwasyon, available ang AccelerateDecelerateInterpolator (ease-in-out), AccelerateInterpolator (ease-in), at DecelerateInterpolator (ease-out).

Sa Jetpack Compose, ang easing ay tinutukoy sa pamamagitan ng object na Easing mula sa package na androidx.compose.animation. Available ang FastOutSlowInEasing, LinearOutSlowInEasing, FastOutLinearInEasing, pati na rin ang custom na Easing sa pamamagitan ng CubicBezierEasing. Ang Compose Easing ay inilalapat sa animate*AsState, AnimatedVisibility at AnimatedContent. Ang pangunahing pagkakaiba mula sa View system: Ang Compose ay nag-i-interpolate ng easing sa panig ng Kotlin (hindi sa RenderNode), na nagbibigay ng higit na flexibility para sa custom na animation, ngunit nangangailangan ng optimization sa mga 120Hz display.

Mga halimbawa ng code

iOS: CAMediaTimingFunction na may CABasicAnimation

Pangunahing animation ng posisyon ng layer na may custom na ease-in-out curve. Ang CAMediaTimingFunction ay tumatanggap ng mga control point ng cubic Bézier na tumutukoy sa makinis na simula at wakas ng paggalaw.

swift
import UIKit

func animateLayerPosition() {
    let animation = CABasicAnimation(keyPath: "position")
    animation.fromValue = CGPoint(x: 0, y: 0)
    animation.toValue = CGPoint(x: 300, y: 400)
    animation.duration = 0.8

    let easing = CAMediaTimingFunction(
        controlPoints: 0.42, 0.0, 0.58, 1.0
    )
    animation.timingFunction = easing
    animation.fillMode = .forwards
    animation.isRemovedOnCompletion = false

    layer.add(animation, forKey: "positionAnimation")
}

Ang mga control point (0.42, 0.0, 0.58, 1.0) ay tumutukoy sa standard na ease-in-out curve. Ginagamit ng SwiftUI ang parehong mga punto para sa Animation.easeInOut. Para sa ease-in, gamitin ang (0.42, 0.0, 1.0, 1.0), para sa ease-out — (0.0, 0.0, 0.58, 1.0). Isinasagawa ng Core Animation ang animation sa render server na may frequency na 60/120 fps.

SwiftUI: Easing na may timingCurve

Declarative animation sa SwiftUI na may custom na curve at spring effect. Ang modifier na animation ay nakatali sa pagbabago ng isAnimated.

swift
import SwiftUI

struct EasingExampleView: View {
    @State private var isAnimated = false

    var body: some View {
        VStack {
            Circle()
                .fill(Color.blue)
                .frame(width: 60, height: 60)
                .offset(x: isAnimated ? 100 : 0, y: 0)
                .animation(
                    .timingCurve(0.42, 0.0, 0.58, 1.0, duration: 0.6),
                    value: isAnimated
                )

            Button("Toggle") {
                isAnimated.toggle()
            }
        }
    }
}

Ang modifier na .timingCurve(c0x, c0y, c1x, c1y, duration) ay lumilikha ng custom na easing animation sa SwiftUI. Ang parameter na value ay nag-uugnay ng animation sa isang partikular na estado — kapag nagbago ang isAnimated, awtomatikong inilalapat ng SwiftUI ang curve. Para sa spring animation, gamitin ang .spring(response: 0.4, dampingFraction: 0.6) sa halip na timingCurve.

Android: PathInterpolator na may custom na easing

Katumbas ng ease-in-out sa Android sa pamamagitan ng PathInterpolator. Ang mga control point (0.42, 0.0, 0.58, 1.0) ay tumutukoy sa parehong curve tulad ng sa iOS.

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

fun View.fadeInWithEase() {
    val path = Path().apply {
        cubicTo(0.42f, 0.0f, 0.58f, 1.0f, 1.0f, 1.0f)
    }
    val interpolator = PathInterpolator(path)

    ObjectAnimator.ofFloat(this, "alpha", 0f, 1f).apply {
        duration = 500
        interpolator = interpolator
        start()
    }
}

Ang PathInterpolator na may mga control point (0.42, 0.0, 0.58, 1.0) ay kapareho ng CAMediaTimingFunction ease-in-out sa iOS. Para sa cross-platform project, gamitin ang parehong mga control point — ito ay ginagarantiyahan ang biswal na kaparehong pag-uugali ng animation. Inirerekomenda ng Material Design ang FastOutSlowInInterpolator (0.4, 0.0, 0.2, 1.0) bilang alternatibo para sa Android-specific na interface.

Jetpack Compose: Easing na may CubicBezierEasing

Sa Compose, ang easing ay tinutukoy sa pamamagitan ng CubicBezierEasing na may parehong mga control point. Ang resulta — makinis na paglitaw ng elemento na may transparency at paglipat.

kotlin
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.core.CubicBezierEasing
import androidx.compose.animation.core.tween
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.runtime.*

@Composable
fun EasingComposable() {
    var visible by remember { mutableStateOf(false) }
    val easing = CubicBezierEasing(0.42f, 0.0f, 0.58f, 1.0f)

    val alpha by animateFloatAsState(
        targetValue = if (visible) 1f else 0f,
        animationSpec = tween(durationMillis = 500, easing = easing)
    )

    Column {
        Button(onClick = { visible = !visible }) {
            Text("Toggle")
        }

        Box(
            modifier = Modifier
                .size(100.dp)
                .graphicsLayer(alpha = alpha)
                .background(MaterialTheme.colorScheme.primary)
        )
    }
}

Ang CubicBezierEasing sa Compose ay tumatanggap ng parehong 4 na parameter ng control point. Awtomatikong ini-interpolate ng animateFloatAsState ang halaga ng alpha na may ibinigay na curve. Para sa paghahambing: ang FastOutSlowInEasing sa Compose ay katumbas ng (0.4, 0.0, 0.2, 1.0) — ang standard curve ng Material Design 3. Ang mga custom na curve sa pamamagitan ng CubicBezierEasing ay nagbibigay ng buong kontrol para sa brand animation.

Mga madalas itanong

Ano ang pagkakaiba ng easing at interpolator?

Ang Easing — pangkalahatang konsepto ng function ng paglambot, ginagamit sa iOS (CAMediaTimingFunction), web (CSS ease-in-out) at disenyo. Ang Interpolator — pagpapatupad ng konseptong ito sa Android (TimeInterpolator). Sa esensya, ito ay pareho — isang mathematical curve ng bilis ng animation. Ang pagkakaiba ay nasa pangalan at API ng platform lamang. Sa mga cross-platform project, ang terminong easing ay ginagamit bilang universal.

Anong mga easing function ang available sa iOS?

Ang iOS ay nagbibigay ng CAMediaTimingFunction na may 5 paunang natukoy na function: linear, easeIn, easeOut, easeInEaseOut, at custom (cubic Bézier). Sa SwiftUI, available ang Animation.easeIn, Animation.easeOut, Animation.easeInOut, Animation.spring at Animation.interpolatingSpring. Para sa custom na curve, gamitin ang Animation.timingCurve(c0x, c0y, c1x, c1y, duration:).

Maaari ba akong gumamit ng parehong easing function sa iOS at Android?

Oo, kung itatakda mo ang parehong cubic Bézier curve. Ang CAMediaTimingFunction sa iOS at PathInterpolator sa Android ay tumatanggap ng mga control point ng cubic Bézier (x1, y1, x2, y2). Halimbawa, ang curve na ease-in-out (0.42, 0.0, 0.58, 1.0) ay magbibigay ng kaparehong pag-uugali sa parehong platform. Ginagamit ng Material Design ang approach na ito para sa cross-platform animation.

Paano pumili ng tamang easing curve para sa aking application?

Gamitin ang mga alituntunin ng Material Design Motion: para sa paglitaw ng mga elemento — ease-out (mabilis na simula, makinis na wakas), para sa paglaho — ease-in (mabilis na wakas), para sa paglipat sa pagitan ng mga screen — ease-in-out. Gamitin ang spring animation para sa mga interactive na elemento (mga button, card). Iwasan ang linear — ito ay mukhang hindi natural.

Bakit ang aking animation na may easing ay mukhang maalog?

Ang pagkaalog (jank) ay nangyayari kapag ang animation ay hindi umabot sa 60fps. Suriin: gumagamit ka ba ng CAMediaTimingFunction (hindi timer) sa iOS, PathInterpolator (hindi Handler.post) sa Android. Ang mabibigat na kalkulasyon sa main thread, kumplikadong hierarchy ng layer, o malaking drawable ay maaaring magdulot ng pagbagsak ng frame. Sa iOS, gamitin ang Core Animation na may shouldRasterize para sa kumplikadong layer; sa Android — Hardware Acceleration at GPU rendering.

Buod

  • Ang Easing ay function ng bilis ng animation na nagpapaging natural sa paggalaw sa pamamagitan ng non-linear na pagbabago ng mga parameter sa paglipas ng panahon.
  • Ang iOS CAMediaTimingFunction at SwiftUI Animation.timingCurve ay nagpapatupad ng easing sa pamamagitan ng cubic Bézier curve na may dalawang control point.
  • Ang Android PathInterpolator at Compose CubicBezierEasing — kumpletong analogo ng iOS para sa custom na smoothing curve.
  • Ang cross-platform easing curve ay tinutukoy ng magkaparehong control point — pundasyon ng unipikasyon ng animation.
  • Inirerekomenda ng Material Design 3 ang fast-out-slow-in para sa paglitaw, linear-out-slow-in para sa paglaho.
  • Ang spring animation sa SwiftUI (Animation.spring) at Compose (spring()) ay lumilikha ng pisikal na spring effect na may dampingFraction.
  • Hindi inirerekomenda ang linear easing para sa interface animation — ito ay mukhang hindi natural at mekanikal.

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din