invalidate() — یہ کیا ہے، دوبارہ ڈرائو کا طریقہ کار اور invalidate(Rect)

مصنف: IT Sectr اشاعت: 2026-07-20 مطالعے کا وقت: 7 منٹ

invalidate() Android میں View کلاس کا ایک طریقہ ہے جو ایک ویو کو دوبارہ ڈرائو کرنے کی ضرورت کے طور پر نشان زد کرتا ہے۔ invalidate() کو کال کرنے سے اگلے اسکرین ریفریش سائیکل میں ویو کا دوبارہ ڈرائو شروع ہوتا ہے، جو اسے کسٹم کمپوننٹ کی بصری حالت کو اپ ڈیٹ کرنے کا بنیادی طریقہ کار بناتا ہے۔ Android Developers Documentation (2025) کے مطابق، invalidate() 90% کسٹم View میں ڈیٹا تبدیلیوں کو اسکرین پر ڈسپلے کے ساتھ مطابقت پذیر کرنے کے لیے استعمال ہوتا ہے۔ یہ طریقہ غیر متزامن طور پر کام کرتا ہے — یہ صرف dirty فلیگ سیٹ کرتا ہے اور فوری طور پر کنٹرول واپس کر دیتا ہے۔

اہم نکات

  • invalidate() — Android میں View دوبارہ ڈرائو کرنے کی ایک غیر متزامن درخواست، dirty فلیگ میکانزم کے ذریعے کام کرتی ہے
  • postInvalidate() — پس منظر کے تھریڈ سے کال کرنے کے لیے invalidate() کا ورژن، تھریڈ محفوظ
  • invalidate(Rect) — کارکردگی کی اصلاح کے لیے صرف مخصوص علاقے کا جزوی دوبارہ ڈرائو
  • onDraw() — وہ طریقہ جو invalidate() کے بعد سسٹم کال کرتا ہے، iOS میں draw(_:) سے ملتا جلتا
  • invalidate() vs requestLayout() — invalidate() مواد کو دوبارہ ڈرائو کرتا ہے، requestLayout() جیومیٹری دوبارہ حساب کرتا ہے

Android میں invalidate() کیا ہے

invalidate() android.view.View کلاس کا ایک طریقہ ہے جو Android سسٹم کو بتاتا ہے کہ ایک ویو کی بصری نمائندگی پرانی ہو چکی ہے۔ طریقہ کال کرنے کے بعد، سسٹم ویو کو dirty کے طور پر نشان زد کرتا ہے اور اگلے اسکرین ریفریش سائیکل میں اس کے دوبارہ ڈرائو کا شیڈول بناتا ہے (عام طور پر 60 FPS کے لیے 16 ms)۔

invalidate() طریقہ مختلف شکلوں میں آتا ہے: بغیر پیرامیٹر (مکمل دوبارہ ڈرائو)، Rect پیرامیٹر کے ساتھ (جزوی)، اور ltrb پیرامیٹر (left, top, right, bottom) کے ساتھ۔ تمام ورژن غیر متزامن طور پر کام کرتے ہیں اور UI تھریڈ سے کال کیے جانے چاہئیں۔ پس منظر کے تھریڈ سے کال کرنے کے لیے postInvalidate() موجود ہے۔

invalidate() کے ذریعے دوبارہ ڈرائو کیسے کام کرتا ہے

Android میں دوبارہ ڈرائو کا طریقہ کار ViewRootImpl پر مبنی ہے — ایک داخلی کمپوننٹ جو View درجہ بندی کو ڈرائو کے لیے Surface سے جوڑتا ہے۔ جب invalidate() کال کیا جاتا ہے، ViewRootImpl ویو کے علاقے کو dirty کے طور پر نشان زد کرتا ہے اور Choreographer کے ذریعے دوبارہ ڈرائو کی درخواست بھیجتا ہے — ایک سسٹم سروس جو ڈرائو کو اسکرین ریفریش ریٹ کے ساتھ مطابقت پذیر کرتی ہے۔

دوبارہ ڈرائو کا چکر

Choreographer Vsync سے سگنل وصول کرتا ہے اور تین مراحل کا عمل شروع کرتا ہے: measure، layout، draw۔ تاہم، invalidate() صرف draw مرحلے کو متاثر کرتا ہے — measure اور layout مراحل اس وقت تک عمل میں نہیں آتے جب تک requestLayout() کال نہ کیا جائے۔ یہ ایک اہم فرق ہے: invalidate() requestLayout() سے ہلکا ہے کیونکہ یہ جیومیٹری کا دوبارہ حساب نہیں کرتا۔

kotlin
class CustomChartView(context: Context, attrs: AttributeSet?)
    : View(context, attrs) {

    private var dataPoints: List<Float> = emptyList()
    private val paint = Paint(Paint.ANTI_ALIAS_FLAG)

    fun updateData(newPoints: List<Float>) {
        dataPoints = newPoints
        invalidate() // دوبارہ ڈرائو کی درخواست
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        paint.color = Color.BLUE
        paint.strokeWidth = 4f
        paint.style = Paint.Style.STROKE

        // چارٹ لائن کھینچنا
        val path = Path()
        dataPoints.forEachIndexed { index, value ->
            val x = index * width / max(dataPoints.size - 1, 1)
            val y = height - value * height
            if (index == 0) path.moveTo(x, y)
            else path.lineTo(x, y)
        }
        canvas.drawPath(path, paint)
    }
}

اس مثال میں، ایک گراف ڈرائو کرنے کے لیے ایک کسٹم View ڈیٹا اپ ڈیٹ ہونے پر invalidate() کال کرتا ہے۔ سسٹم درجہ بندی میں دوسرے عناصر کو متاثر کیے بغیر صرف اس View کو دوبارہ ڈرائو کرتا ہے۔ onDraw() Path کے ذریعے لکیریں کھینچنے کے لیے Canvas وصول کرتا ہے۔

invalidate() بمقابلہ postInvalidate()

invalidate() اور postInvalidate() کے درمیان بنیادی فرق تھریڈ کی حفاظت میں ہے۔ invalidate() صرف UI تھریڈ (مرکزی تھریڈ) سے کال کیا جانا چاہیے۔ postInvalidate() کسی بھی تھریڈ سے کال کیا جا سکتا ہے — یہ Handler کے ذریعے UI تھریڈ کو دوبارہ ڈرائو کی درخواست بھیجتا ہے۔

خصوصیتinvalidate()postInvalidate()
کال تھریڈUI تھریڈ (مرکزی تھریڈ)کوئی بھی تھریڈ
میکانزمبراہ راست dirty فلیگ اپ ڈیٹHandler.post() کے ذریعے UI تھریڈ تک
تاخیرکم سے کم، موجودہ چکر میںاگلے UI تھریڈ چکر تک
کارکردگیاعلیHandler پر ہلکا اوورہیڈ
سفارشUI تھریڈ کے لیے ہمیشہ invalidate()صرف پس منظر کے تھریڈ کے لیے

عملی طور پر، postInvalidate() نیٹ ورک ڈیٹا لوڈنگ، سینسر نتائج پروسیسنگ یا پس منظر کے حساب کتاب کے منظرناموں میں استعمال ہوتا ہے۔ اگر آپ UI تھریڈ میں ہیں — کم سے کم تاخیر کے لیے ہمیشہ invalidate() استعمال کریں۔

kotlin
    // UI تھریڈ سے کال کیا گیا
view.invalidate()

    // پس منظر کے تھریڈ سے کال کیا گیا
Thread {
    // بھاری حسابات
    val result = performHeavyCalculation()
    runOnUiThread {
        updateUi(result)
    }
}.start()

invalidate(Rect) کے ذریعے جزوی دوبارہ ڈرائو

invalidate(Rect) اور invalidate(int l, int t, int r, int b) دوبارہ ڈرائو کے علاقے کو محدود کرنے کی اجازت دیتے ہیں۔ یہ کارکردگی کے لیے اہم ہے: جب View کا صرف ایک حصہ تبدیل ہوتا ہے (مثلاً، کرسر کی حرکت، اشارے کی تبدیلی)، پورے ویو کو دوبارہ ڈرائو کرنے کی ضرورت نہیں ہے۔

سسٹم مخصوص dirty مستطیل کو onDraw() میں canvas.clipBounds کے ذریعے بھیجتا ہے۔ onDraw() کے اندر، آپ clipBounds چیک کر سکتے ہیں اور صرف اس علاقے کے اندر ڈرائو کر سکتے ہیں، حالانکہ Android Canvas خود بخود dirty مستطیل کے باہر ڈرائو کو کلپ کرتا ہے۔

kotlin
    // جزوی اپ ڈیٹ: صرف کرسر کا علاقہ
private val cursorRect = Rect()

fun moveCursorTo(newX: Int, newY: Int) {
    // پرانی پوزیشن کو باطل کریں
    invalidate(cursorRect)

    cursorRect.set(newX - 5, newY - 5,
                  newX + 5, newY + 5)

    // نئی پوزیشن کو باطل کریں
    invalidate(cursorRect)
}

جزوی دوبارہ ڈرائو کے بغیر، ہر کرسر حرکت پورے View کو دوبارہ ڈرائو کرے گی، جو ایک بڑے گراف کے لیے چند درجن کے بجائے ہزاروں پکسلز کو دوبارہ ڈرائو کرنے کے برابر ہے۔ invalidate(Rect) ایڈیٹرز، ڈرائو کینوس اور اینی میٹڈ کمپوننٹ کے لیے ایک ضروری تکنیک ہے۔

invalidate() بمقابلہ requestLayout(): کیا فرق ہے

ایک عام غلطی requestLayout() کو کال کرنا ہے جہاں invalidate() کافی ہوگا، اور اس کے برعکس۔ فرق بنیادی ہے: invalidate() صرف draw مرحلے کو متاثر کرتا ہے، جبکہ requestLayout() ایک مکمل measure → layout → draw چکر شروع کرتا ہے۔

پہلوinvalidate()requestLayout()
چکر کے مراحلصرف drawmeasure + layout + draw
کب استعمال کریںصرف رینڈرنگ تبدیل ہوتی ہے (رنگ، متن، گرافکس)View کا سائز یا مقام تبدیل ہوتا ہے
کارکردگیہلکا — صرف دوبارہ ڈرائوبھاری — درجہ بندی دوبارہ حساب
درجہ بندی پر اثرصرف موجودہ Viewوالد کنٹینرز کو متاثر کر سکتا ہے

اگر آپ TextView میں متن تبدیل کرتے ہیں، تو invalidate() کافی ہے کیونکہ View کا سائز نہیں بدلتا۔ اگر متن نئی لائن میں جا سکتا ہے اور اونچائی بڑھا سکتا ہے، تو requestLayout() کی ضرورت ہے۔ Android Lint کارکردگی کے قواعد کے ذریعے ایسی غلطیوں کو ٹریک کرنے میں مدد کرتا ہے۔

invalidate() کارکردگی کی اصلاح

ضرورت سے زیادہ invalidate() کالز Android میں کسٹم View کی خراب کارکردگی کی ایک اہم وجہ ہیں۔ آئیے اصلاح کی تکنیکوں کو دیکھتے ہیں۔

کال کی فریکوئنسی کم سے کم کریں

اگر ڈیٹا زیادہ فریکوئنسی (سینسرز، اینی میشن، ویڈیو) پر اپ ڈیٹ ہوتا ہے، تو ہر تبدیلی پر invalidate() کال نہ کریں۔ اسکرین ریفریش ریٹ کے ساتھ مطابقت پذیر ہونے کے لیے ValueAnimator یا Choreographer.FrameCallback استعمال کریں۔ یہ یقینی بناتا ہے کہ invalidate() فی فریم ایک بار سے زیادہ کال نہ ہو۔

ہارڈویئر ایکسلریشن استعمال کریں

API 14 سے، Android GPU کے ذریعے ہارڈویئر ایکسلریشن کو سپورٹ کرتا ہے۔ اگر آپ کا کسٹم View صرف Canvas API (drawRect، drawCircle، drawPath) استعمال کرتا ہے، تو ایکسلریشن شفاف طریقے سے کام کرتی ہے۔ DisplayList مطابق آپریشنز کے لیے، invalidate() نمایاں طور پر تیزی سے پروسیس ہوتا ہے۔

kotlin
// Vsync مطابقت کے لیے Choreographer استعمال کرنا
private val frameCallback = Choreographer.FrameCallback { frameTimeNanos ->
    updateAnimation(frameTimeNanos)
    invalidate()
    Choreographer.getInstance().postFrameCallback(this)
}

fun startAnimation() {
    Choreographer.getInstance().postFrameCallback(frameCallback)
}

ہدفی اپ ڈیٹس کے لیے invalidate(Rect) استعمال کریں، onDraw() سے invalidate() کال کرنے سے گریز کریں (لامحدود لوپ)، اور ہمیشہ ڈیوائس پر GPU Profile Rendering کے ذریعے پروفائل کریں۔ یہ ہر فریم کا صحیح رینڈرنگ وقت دکھائے گا اور مسائل والے علاقوں کی شناخت میں مدد کرے گا۔

اکثر پوچھے گئے سوالات

کیا onDraw() سے invalidate() کال کیا جا سکتا ہے؟

نہیں، onDraw() کے اندر invalidate() کال کرنا دوبارہ ڈرائو کا ایک لامحدود لوپ بناتا ہے: onDraw() invalidate() کال کرتا ہے، جو پھر سے onDraw() کو متحرک کرتا ہے۔ اس سے CPU 100% استعمال اور فریم ڈراپ ہوتا ہے۔ ValueAnimator یا Choreographer کے ذریعے اینی میشن استعمال کریں۔

invalidate() postInvalidate() سے کیسے مختلف ہے؟

invalidate() صرف UI تھریڈ میں کام کرتا ہے اور dirty فلیگ کو فوری طور پر اپ ڈیٹ کرتا ہے۔ postInvalidate() Handler کے ذریعے UI تھریڈ کو درخواست بھیجتا ہے اور کسی بھی پس منظر کے تھریڈ سے کال کیا جا سکتا ہے۔ اگر آپ UI تھریڈ میں ہیں — کم سے کم تاخیر کے لیے invalidate() استعمال کریں۔

کیا TextView میں setText() خود بخود invalidate() کال کرتا ہے؟

ہاں، اندرونی طور پر TextView کا setText() طریقہ متن اپ ڈیٹ کرنے کے بعد invalidate() کال کرتا ہے۔ اگر متن View کے طول و عرض کو تبدیل کرتا ہے، تو requestLayout() بھی کال کیا جاتا ہے۔ معیاری ویجٹ کے ساتھ کام کرتے وقت ڈیولپرز کو دستی طور پر invalidate() کال کرنے کی ضرورت نہیں ہے۔

60 FPS پر invalidate() کارکردگی کو کیسے متاثر کرتا ہے؟

ہر invalidate() کال اگلے Vsync (ہر 16 ms بعد) میں دوبارہ ڈرائو کا شیڈول بناتی ہے۔ اگر onDraw() کو 16 ms سے زیادہ وقت لگتا ہے، تو فریم ڈراپ ہوتا ہے۔ onDraw() کو بہتر بنائیں — Bitmap کو کیش کریں، مختص کرنے سے گریز کریں، اور GPU رینڈرنگ کے لیے ہارڈویئر ایکسلریشن استعمال کریں۔

کیا Paint خصوصیات تبدیل کرنے کے بعد invalidate() کال کرنا ضروری ہے؟

ہاں، Paint خصوصیات (رنگ، موٹائی، اسٹائل) تبدیل کرنے کے بعد، آپ کو invalidate() کال کرنا ہوگا، کیونکہ View خود بخود Paint آبجیکٹ کی تبدیلیوں کو ٹریک نہیں کرتا۔ سسٹم نہیں جانتا کہ Paint تبدیل ہوا ہے اور واضح درخواست کے بغیر onDraw() کال نہیں کرے گا۔

خلاصہ

  • invalidate() — Android میں View دوبارہ ڈرائو کی درخواست کا بنیادی طریقہ کار، dirty فلیگ کے ذریعے غیر متزامن طور پر کام کرتا ہے
  • postInvalidate() — پس منظر کے تھریڈ سے کال کے لیے تھریڈ محفوظ ورژن، Handler استعمال کرتا ہے
  • invalidate(Rect) — صرف مخصوص علاقے کا جزوی دوبارہ ڈرائو، ہدفی تبدیلیوں کے لیے کارکردگی کے لیے اہم
  • requestLayout() — مکمل measure + layout + draw چکر شروع کرتا ہے، invalidate() سے نمایاں طور پر بھاری
  • Choreographer — Vsync مطابقت پذیری کے لیے سسٹم سروس، invalidate() کے ساتھ اینی میشن کے لیے تجویز کردہ
  • Hardware Acceleration — API 14 سے دستیاب GPU ایکسلریشن، Canvas API کے لیے invalidate() پروسیسنگ کو تیز کرتی ہے
  • GPU Profile Rendering — رینڈرنگ وقت کی پیمائش اور سست onDraw() طریقوں کی نشاندہی کے لیے پروفائلنگ ٹول

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں