Sobes.tech
Junior

Android'de özel View'in yeniden çizimini nasıl tetiklersiniz?

sobes.tech yapay zeka

AI'dan gelen yanıt

Özelleştirilmiş bir View'ı geçersiz kılmak (invalidate) için birkaç yöntem vardır:

  1. invalidate():

    • Tüm View'ı yeniden çizer.
    • onDraw() çağrısını planlar.
    • Belirli bir alan belirtmeden basit yeniden çizim için kullanılır.
    // View'inizin içinde veya onunla etkileşim sırasında
    myCustomView.invalidate()
    
  2. invalidate(Rect dirty) veya invalidate(int left, int top, int right, int bottom):

    • Sadece belirtilen alanı yeniden çizer.
    • Değişiklikler yalnızca View'in bir kısmını etkiliyorsa daha optimize olur.
    // Koordinatları (10, 20) ile (100, 150) olan alanı yeniden çiz
    myCustomView.invalidate(10, 20, 100, 150)
    
    // Veya Rect kullanarak
    val dirtyRect = Rect(10, 20, 100, 150)
    myCustomView.invalidate(dirtyRect)
    
  3. postInvalidate():

    • Herhangi bir iş parçacığından çağrılabilir, arka plan iş parçacıkları dahil.
    • invalidate() işlemini UI iş parçacığında gerçekleştirmek üzere mesaj kuyruğuna ekler.
    // Arka plan iş parçacığından
    Thread {
        // Uzun hesaplamalar yap
        // ...
        myCustomView.postInvalidate()
    }.start()
    

invalidate() ve postInvalidate() karşılaştırması:

Yöntem İşlem İş Parçası Arka Plan İş Parçasından Güvenli Amaç
invalidate() UI iş parçası Hayır Anında yeniden çizim (UI iş parçasında mümkün olan en kısa sürede)
postInvalidate() UI iş parçası Evet Mesaj kuyruğuna alınmış gecikmiş yeniden çizim

onDraw() ile ilişkisi:

Herhangi bir invalidate(...) yöntemi çağrısı, View'inizin onDraw() metodunun çalıştırılmasını planlar. Android sistemi, performansı optimize etmek için mümkünse birkaç invalidate isteğini tek bir istekte birleştirir. onDraw() yalnızca sistem yeniden çizime hazır olduğunda çağrılır.

Her yöntemi ne zaman kullanmalı:

  • invalidate() kullanın, UI iş parçasında (örneğin, tıklama işleyicisinde, bir animasyon sonrası) ve değişiklikler tüm View'i etkiliyorsa veya alan optimizasyonu önemli değilse.
  • invalidate(Rect) veya invalidate(int, int, int, int) kullanın, değişiklikler yalnızca View'in bir kısmını etkiliyorsa ve UI iş parçasında bulunuyorsanız.
  • postInvalidate() kullanın, arka plan iş parçacığından invalidate çağırmanız gerekiyorsa.
  • invalidate() veya postInvalidate()'u çok sık çağırmayın, çünkü bu performansı olumsuz etkileyebilir. Sadece veri veya View durumundaki değişiklikler görsel güncellemeyi gerektiriyorsa çağırın.