Sobes.tech
Junior

Jak vyvolat překreslení vlastního View v Androidu?

sobes.tech AI

Odpověď od AI

Existuje několik způsobů, jak vyvolat překreslení (invalidate) vlastního View:

  1. invalidate():

    • Překreslí celý View.
    • Naplánuje volání onDraw().
    • Používá se pro jednoduché překreslení bez určení konkrétní oblasti.
    // Uvnitř vašeho View nebo při interakci s ním
    myCustomView.invalidate()
    
  2. invalidate(Rect dirty) nebo invalidate(int left, int top, int right, int bottom):

    • Překreslí pouze určenou oblast View.
    • Je to efektivnější, pokud změny ovlivňují pouze část View.
    // Překreslit oblast s souřadnicemi (10, 20) po (100, 150)
    myCustomView.invalidate(10, 20, 100, 150)
    
    // Nebo pomocí Rect
    val dirtyRect = Rect(10, 20, 100, 150)
    myCustomView.invalidate(dirtyRect)
    
  3. postInvalidate():

    • Bezpečné volání z jakéhokoliv vlákna, včetně pozadí.
    • Umístí operaci invalidate() do fronty zpráv k provedení na UI vlákně.
    // Volání z pozadí vlákna
    Thread {
        // Provádíme dlouhé výpočty
        // ...
        myCustomView.postInvalidate()
    }.start()
    

Porovnání invalidate() a postInvalidate():

Metoda Vlákno provádění Bezpečnost z pozadí vlákna Účel
invalidate() UI vlákno Ne Okamžité překreslení (pokud je to možné na UI vlákně)
postInvalidate() UI vlákno Ano Odložené překreslení vložením do fronty zpráv

Vztah s onDraw():

Volání kteréhokoliv z metod invalidate(...) plánuje provedení metody onDraw() vašeho View. Android systém slučuje několik požadavků na invalidate do jednoho, pokud je to možné, pro optimalizaci výkonu. onDraw() je voláno pouze tehdy, když je systém připraven k překreslení.

Kdy použít každou metodu:

  • Použijte invalidate(), když jste na UI vlákně (například v obsluze kliknutí, po animaci) a změny ovlivňují celý View nebo vám nezáleží na optimalizaci podle oblasti.
  • Použijte invalidate(Rect) nebo invalidate(int, int, int, int) pro optimalizaci, pokud změny ovlivňují pouze část View a jste na UI vlákně.
  • Použijte postInvalidate(), když potřebujete volat invalidate z pozadí vlákna.
  • Nevolávejte invalidate() nebo postInvalidate() příliš často bez potřeby, protože to může negativně ovlivnit výkon. Volte je pouze po změně dat nebo stavu View, které vyžadují vizuální aktualizaci.