Junior
Androidда өзгөчөлөнгөн View-дин кайра чийрэгенин чакыруусу кандай?
sobes.tech AI
AIден жооп
Көптөгөн жолдору бар, өзгөчөлөнгөн View үчүн кайра салуу (invalidate) чакырууга:
-
invalidate():
- Бардык View-ди кайра салат.
onDraw()чакыруусун пландаштырат.- Өзгөчө аймакты көрсөтпөстөн жөнөкөй кайра салуу үчүн колдонулат.
// Сиздин View ичинде же анын менен өз ара аракеттенүүдө myCustomView.invalidate() -
invalidate(Rect dirty) же invalidate(int left, int top, int right, int bottom):
- Тек гана белгиленген View аймагын кайра салат.
- Эгер өзгөртүүлөр Viewдин бир бөлүгүн гана камтыса, натыйжалуу.
// Координаттары (10, 20) менен (100, 150) болгон аймакты кайра салуу myCustomView.invalidate(10, 20, 100, 150) // же Rect колдонуу val dirtyRect = Rect(10, 20, 100, 150) myCustomView.invalidate(dirtyRect) -
postInvalidate():
- Ар бир жиптен, анын ичинде фондук жиптен да ишенимдүү.
invalidate()операциясын UI жипинде аткаруу үчүн билдирүү кезегине коюу.
// Фондук жиптен чакыруу Thread { // Узак эсептөөлөрдү жүргүзүү // ... myCustomView.postInvalidate() }.start()
invalidate() жана postInvalidate() салыштыруу:
| Метод | Ишке ашыруу жипи | Фондук жиптен коопсуздугу | Максаты |
|---|---|---|---|
invalidate() |
UI жипи | Жок | Тез арада кайра салуу (UI жипинде мүмкүн болгон ченемде) |
postInvalidate() |
UI жипи | Ооба | Кийинки кезекке коюу аркылуу кечиктирилген кайра салуу |
onDraw() менен байланышы:
Кандайдыр бир invalidate(...) ыкмасы чакырылса, ал сиздин View-дин onDraw() ыкмасын ишке ашыруу үчүн пландаштырылат. Android системасы натыйжалуулук үчүн бир нече invalidate талаптарын бириктирет, эгер мүмкүн болсо. onDraw() гана систем даяр болгондо чакырылат.
Ар бир ыкманы качан колдонуу керек:
invalidate()колдонуу, эгер сиз UI жипинде болсоңуз (мисалы, клик иштетүүчүдө, анимациядан кийин) жана өзгөртүүлөр бүт View-га таасир этсе же аймактык оптималдаштырууга маани бербесеңиз.invalidate(Rect)жеinvalidate(int, int, int, int)колдонуу, эгер өзгөртүүлөр гана Viewдин бир бөлүгүнө тиешелүү болсо жана сиз UI жипинде болсоңуз.postInvalidate()колдонуу, эгер сизinvalidate()-ди фоновая жиптен чакыргыңыз келсе.- Аларды ашыкча көп чакырбоңуз, анткени бул иштөө ылдамдыгына терс таасир этиши мүмкүн. Алардын чакырылышын гана өзгөртүүлөрдөн кийин, Viewдин көрүнүшүн жаңыртуу үчүн колдонуу керек.