π± Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΉ Π² Android Ρ ΠΏΠΎΠΌΠΎΡΡΡ Kaspresso
Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ UI Π² Android-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ β ΡΡΠΎ Π²ΡΠ΅Π³Π΄Π° Π±Π°Π»Π°Π½Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ ΠΈ ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎΠΌ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ. ΠΡΠΎΠ²Π΅ΡΠΈΡΡ, ΡΡΠΎ Π²ΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ β Π½Π΅ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½Π°Ρ Π·Π°Π΄Π°ΡΠ° ΠΈ ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Espresso ΡΠΎΡΡΠ΅Π΄ΠΎΡΠΎΡΠΈΠ²Π°ΡΡΡΡ Π»ΠΎΠ³ΠΈΠΊΠ΅ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ: ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΡΠ΅ΠΊΡΡΡ, ΠΊΠ»ΠΈΠΊΠΈ, ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Ρ, ΡΠ²Π΅ΡΠ°. ΠΠΎ ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΡ Π·Π°Ρ ΠΎΠ΄ΠΈΡ ΠΎΠ± ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΡ ΠΈΠ»ΠΈ Π°Π½ΠΈΠΌΠ°ΡΠΈΡΡ β ΡΠ°ΡΡΠΎ ΡΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΈΠ»ΠΈ ΡΠΎΠ²ΡΠ΅ΠΌ ΠΎΡΡΠ°Π²Π»ΡΡΡ Π½Π΅Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ, Π»ΠΈΠ±ΠΎ ΠΎΡΡΠ°Π²Π»ΡΡΡ ΡΡΠΎ ΡΠΊΡΠΈΠ½ΡΠΎΡΠ½ΡΠΌ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°ΠΌ.

Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Ρ ΠΏΠΎΠΊΠ°ΠΆΡ, ΠΊΠ°ΠΊ ΠΌΡ ΠΏΠΎΡΠ»ΠΈ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΡΡΡΠΌ β Π½Π°ΡΡΠΈΠ»ΠΈ Kaspresso ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΡΡΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π°ΡΠΈΡΠΎΠ²Π°Π½ΠΎ Π½Π° ΡΠΊΡΠ°Π½Π΅. Π Π°ΡΡΠΊΠ°ΠΆΡ, ΠΊΠ°ΠΊ ΠΌΡ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅ΠΌ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΊΠ°Π΄ΡΡ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ Π²Π½ΡΡΡΠΈ ΠΎΠ±ΡΡΠ½ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² UI-ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ β Π±Π΅Π· ΡΡΠΆΡΠ»ΠΎΠΉ Π°ΡΡΠΈΠ»Π»Π΅ΡΠΈΠΈ ΠΈ Π»ΠΈΡΠ½Π΅ΠΉ Ρ ΡΡΠΏΠΊΠΎΡΡΠΈ.
ΠΠΎΡΠ΅ΠΌΡ Π½Π΅ ΡΠΊΡΠΈΠ½ΡΠΎΡ-ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅?
ΠΠΎΠ³Π΄Π° ΡΠ΅ΡΡ Π·Π°Ρ ΠΎΠ΄ΠΈΡ ΠΎ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΡΡ ΡΠ΅ΡΡΠ°Ρ , ΠΏΠ΅ΡΠ²ΠΎΠ΅, ΡΡΠΎ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ Π² Π³ΠΎΠ»ΠΎΠ²Ρ β ΡΡΠΎ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΈ Π²ΡΠΎΠ΄Π΅ Shot, Paparazzi, Screengrab ΠΈΠ»ΠΈ Facebook Screenshot Tests. ΠΠ½ΠΈ ΠΊΠ°ΠΆΡΡΡΡ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ: Π΄Π΅Π»Π°ΡΡ ΡΠ½ΠΈΠΌΠΊΠΈ ΡΠΊΡΠ°Π½ΠΎΠ² ΠΈ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡ ΠΈΡ Ρ ΡΡΠ°Π»ΠΎΠ½ΠΎΠΌ. ΠΡΠΎΡΡΠ°Ρ ΠΈΠ΄Π΅Ρ β ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΎΡ Π²Π°Ρ.
ΠΠΎ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° Π΅ΡΡΡ ΡΠ²ΠΎΠΈ ΠΌΠΈΠ½ΡΡΡ:
- Π₯ΡΡΠΏΠΊΠΎΡΡΡ. ΠΠ°ΠΆΠ΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ ΠΏΡΠ°Π²ΠΊΠΈ Π² UI (ΡΡΠΈΡΡ, ΡΠ²Π΅Ρ, ΡΠ΅Π½Ρ, ΠΎΡΡΡΡΠΏ) Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΏΠ°Π΄Π΅Π½ΠΈΡ ΡΠ΅ΡΡΠΎΠ². ΠΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΠΊΡΠΈΡΠΈΡΠ½Ρ β Π½ΠΎ ΡΡΠ΅Π±ΡΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΡΠ°Π»ΠΎΠ½Π½ΡΡ ΡΠ½ΠΈΠΌΠΊΠΎΠ².
- Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ CI-ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ. ΠΠ»Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ Π½ΡΠΆΠ΅Π½ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΡΠΉ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³, ΡΠ°ΡΡΠΎ ΡΠΌΡΠ»ΠΈΡΡΠ΅ΠΌΡΠΉ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ΠΌ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Paparazzi ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² JVM, Π½ΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π°. Π Shot β Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π½Π° ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²Π΅, ΡΡΠΎ ΡΡΠ»ΠΎΠΆΠ½ΡΠ΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Π² CI.
- ΠΡΠΎΠ±Π»Π΅ΠΌΡ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎΡΡΠΈ. ΠΠ΄ΠΈΠ½ ΡΠΊΡΠ°Π½ Π² ΡΠ°Π·Π½ΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡΡ β ΡΡΠΎ ΡΠΆΠ΅ Π΄Π΅ΡΡΡΠΊΠΈ ΡΠΊΡΠΈΠ½ΡΠΎΡΠΎΠ². Π Π΅ΡΠ»ΠΈ Π²Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΠ΅ ΡΠ΅ΠΌΡ, ΡΠ·ΡΠΊ, ΠΎΡΠΈΠ΅Π½ΡΠ°ΡΠΈΡ β ΠΈΡ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΠΎΡΠ½ΠΈ.
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Π΄Π»Ρ ΡΠ΅ΡΡΠ°, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌΡΠΌ: Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Ρ Π½ΡΠΆΠ½ΠΎΠΉ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ, ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ Π½Π° ΡΡΡΡΠ΅, Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΠΌ ΠΈΠ»ΠΈ ΡΠ΅Π³ΠΈΠΎΠ½Π°ΠΌ.
ΠΡΠ»ΠΈ ΡΡΠΎ ΡΠΆΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π² ΠΎΠ±ΡΡΠ½ΡΡ UI-ΡΠ΅ΡΡΠ°Ρ , Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°ΡΡ ΡΡ ΠΆΠ΅ Π±ΠΈΠ·Π½Π΅Ρ-Π»ΠΎΠ³ΠΈΠΊΡ ΠΈ Π² ΡΠΊΡΠΈΠ½ΡΠΎΡ-ΡΠ΅ΡΡΠ°Ρ β ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΠΎΡΠΎΠ³ΠΎ ΠΈ Π½Π΅ΡΠ΅Π»Π΅ΡΠΎΠΎΠ±ΡΠ°Π·Π½ΠΎ.
ΠΠΎΡΡΠΎΠΌΡ Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ ΠΏΠΎΡΠ»ΠΈ ΠΏΠΎ ΠΏΡΡΠΈ Π»Π΅Π³ΠΊΠΎΠ²Π΅ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΊΠ»ΡΡΠ΅Π²ΡΡ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² β ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΉ β ΠΏΡΡΠΌΠΎ Π² UI-ΡΠ΅ΡΡΠ°Ρ , ΡΠΆΠ΅ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ Π² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½.
Π§ΡΠΎ ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ?
ΠΠΎΡ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΊΠ΅ΠΉΡ: Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅. ΠΠ°ΠΊ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΠΎΠ½ΠΎ:
- ΠΠΎΠ΄Π³ΡΡΠ·ΠΈΠ»ΠΎΡΡ.
- ΠΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ.
- ΠΠ΅ ΠΈΡΠΊΠ°ΠΆΠ΅Π½ΠΎ (Π½Π΅ ΡΠ°ΡΡΡΠ½ΡΡΠΎ, Π½Π΅ ΠΎΠ±ΡΠ΅Π·Π°Π½ΠΎ)?
Kakao ΠΈ hasDrawable
Π Kakao Π΅ΡΡΡ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΌΠ°ΡΡΠ΅Ρ β KImageView.hasDrawable()
. ΠΡ ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΠ΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΉ drawable, ΠΈ ΠΎΠ½ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅ΡΡΡ Ρ ΡΠ΅ΠΊΡΡΠΈΠΌ. ΠΡΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ toBitmap() β ΡΠΎΠ³Π΄Π° ΡΡΠΈΡΡΠ²Π°ΡΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΡΠΎΠ½ ΠΈΠ»ΠΈ ΠΏΠ»ΠΎΡΠ½ΠΎΡΡΡ ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ.
ΠΠΎ Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° Π΅ΡΡΡ Π΄Π²Π° Π²Π°ΠΆΠ½ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ:
- Drawable Π½Π΅ ΡΠ°Π²Π΅Π½ ΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΠ΅ΡΠΎΠ΄ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ
ImageView.getDrawable()
β ΡΠΎ Π΅ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ. ΠΠΎ ΡΡΠΎ Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ ΠΎΠ½ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΡΡΠΈΡΠΎΠ²Π°Π»ΡΡ Π½Π° ΡΠΊΡΠ°Π½Π΅ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ. ΠΡΠ»ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅Π·Π°Π½ΠΎ, Π½Π΅ Π·Π°Π³ΡΡΠ·ΠΈΠ»ΠΎΡΡ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΊΡΡΡΠΎ ΡΠ΅ΠΌ-ΡΠΎ Π΄ΡΡΠ³ΠΈΠΌ β ΡΠ΅ΡΡ Π²ΡΡ ΡΠ°Π²Π½ΠΎ ΠΏΡΠΎΠΉΠ΄ΡΡ. - Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΠΏΠΈΠΊΡΠ΅Π»Ρ-Π²-ΠΏΠΈΠΊΡΠ΅Π»Ρ β ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΡΡΠΎΠ³ΠΎΠ΅ ΠΠ»Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ
Bitmap.sameAs()
. ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΡΡΠ΅Π±ΡΠ΅Ρ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΎΡΡΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ β Π²ΠΏΠ»ΠΎΡΡ Π΄ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΈΠΊΡΠ΅Π»Ρ. ΠΠ°ΠΆΠ΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ ΠΈΡΠΊΠ°ΠΆΠ΅Π½ΠΈΡ, Π²ΡΠ·Π²Π°Π½Π½ΡΠ΅ ΡΠΆΠ°ΡΠΈΠ΅ΠΌ, ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈΠ»ΠΈ Π½Π΅ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ»ΠΎΡΠ½ΠΎΡΡΠΈ β ΠΏΡΠΈΠ²Π΅Π΄ΡΡ ΠΊ ΠΏΡΠΎΠ²Π°Π»Ρ ΡΠ΅ΡΡΠ°, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΡΠ°Π·Π»ΠΈΡΠΈΡ Π½Π΅Π·Π°ΠΌΠ΅ΡΠ½Ρ Π³Π»Π°Π·Ρ.
ΠΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ?
ΠΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π²Π·ΡΡΡ ΡΡΠΎ-ΡΠΎ Π³ΠΎΡΠΎΠ²ΠΎΠ΅ ΠΈΠ· ΠΌΠΈΡΠ° ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ½ΠΎΠ³ΠΎ Π·ΡΠ΅Π½ΠΈΡ ΠΈ Π½Π° ΡΡΠΎΠΌ ΡΡΠ°ΠΏΠ΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
Core.absdiff
ΠΈΠ· OpenCV β ΡΡΠΈΡΠ°Π΅Ρ Π°Π±ΡΠΎΠ»ΡΡΠ½ΡΡ ΡΠ°Π·Π½ΠΈΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌΠΈ ΠΏΠΈΠΊΡΠ΅Π»Ρ Π·Π° ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΌ.- ΠΠ΅ΡΡΠΈΠΊΠΈ ΡΠΈΠΏΠ° SSIM (Structural Similarity Index) β ΠΎΡΠ΅Π½ΠΈΠ²Π°ΡΡ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΡ ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ ΡΡΡΡΠΊΡΡΡΠ΅, ΠΊΠΎΠ½ΡΡΠ°ΡΡΡ ΠΈ ΡΡΠΊΠΎΡΡΠΈ.
- Perceptual hash (pHash) β Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ Ρ ΡΡ, ΠΎΡΡΠ°ΠΆΠ°ΡΡΠΈΠΉ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅, ΠΈ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ ΠΈΡ .
ΠΠΎ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ Ρ ΡΠ°ΠΊΠΈΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ Π΅ΡΡΡ ΡΠ²ΠΎΠΈ Β«Π½ΠΎΒ»:
- OpenCV β ΠΌΠΎΡΠ½ΡΠΉ, Π½ΠΎ ΡΡΠΆΡΠ»ΡΠΉ ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ²Π°ΡΡ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌΠΈ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π² Android-ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ .
- SSIM/pHash β ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠΌΠ½Ρ Π΄Π»Ρ ΠΏΡΠΎΡΡΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ: ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ βΠΏΡΠΎΡΡΠΈΡΡβ ΠΈΡΠΊΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π±Ρ Π·Π°ΠΌΠ΅ΡΠΈΠ».
- ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π°ΡΠΈΠ²Π½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ Π²ΡΠ΅ΠΌΡ ΡΠ±ΠΎΡΠΊΠΈ ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ»ΠΎΠΆΠ½ΠΈΡΡ CI.
ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ Π²ΡΠ±ΡΠ°Π»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠΉ ΠΈ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΡΠΉ ΠΏΡΡΡ β Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ Π²ΡΡΡΠ½ΡΡ.
ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π³ΠΎΠ²
- ΠΡΠ°Π΄Π°ΡΠΈΠΈ ΡΠ΅ΡΠΎΠ³ΠΎ:
ΠΡΠΈΠ²ΠΎΠ΄ΠΈΠΌ ΠΎΠ±Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡ ΡΠ²Π΅ΡΠΎΠ²ΠΎΠΌΡ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Ρ, ΡΡΠΎΠ±Ρ ΡΠ±ΡΠ°ΡΡ Π²Π»ΠΈΡΠ½ΠΈΠ΅ ΡΠ²Π΅ΡΠ°, ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΡΡΠΌ ΠΈ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠΎΡΠΌΡ ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, Π° Π½Π΅ Π΅Π³ΠΎ ΡΠ²Π΅ΡΠΎΠ²ΡΠ΅ Π½ΡΠ°Π½ΡΡ.
private fun toGrayscale(bmpOriginal: Bitmap): Bitmap { val height = bmpOriginal.height val width = bmpOriginal.width val bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565) val paint = Paint() val cm = ColorMatrix().apply { setSaturation(0f) } paint.colorFilter = ColorMatrixColorFilter(cm) Canvas(bmpGrayscale).drawBitmap(bmpOriginal, 0f, 0f, paint) return bmpGrayscale }
- ΠΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ ΠΌΠΈΠ½ΠΈΠ°ΡΡΡΠ΅:
Π£ΠΌΠ΅Π½ΡΡΠ°Π΅ΠΌ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΡΡΠΎΠ±Ρ ΡΠ³Π»Π°Π΄ΠΈΡΡ ΠΌΠ΅Π»ΠΊΠΈΠ΅ ΠΎΡΠ»ΠΈΡΠΈΡ ΠΈ ΡΡΠΊΠΎΡΠΈΡΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅, ΡΠΎΡ ΡΠ°Π½ΠΈΠ² ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΡΡΡΠΊΡΡΡΡ.
bmp1 = ThumbnailUtils.extractThumbnail(bmp1, SAMPLE_SIZE, SAMPLE_SIZE)
- Π Π°ΡΡΡΡ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΡ Π₯ΡΠΌΠΌΠΈΠ½Π³Π°:
Π Π°ΡΡΡΠΎΡΠ½ΠΈΠ΅ Π₯ΡΠΌΠΌΠΈΠ½Π³Π° ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ Π΄Π²Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΠΎ ΠΏΠΈΠΊΡΠ΅Π»ΡΠΌ: ΠΎΠ½ΠΎ ΡΡΠΈΡΠ°Π΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π½Π΅ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠΉ. ΠΡΠΎ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΎΡΠ΅Π½ΠΈΡΡ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΡ ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎΡΠ»Π΅ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ.
private fun calcHammingDistance(a: IntArray, b: IntArray): Int { var sum = 0 for (i in a.indices) { sum += if (a[i] == b[i]) 0 else 1 } return sum }
- ΠΡΠΎΠ²Π΅ΡΠΊΠ° Ρ ΠΏΠΎΡΠΎΠ³ΠΎΠΌ:
Π‘ΡΠ°Π²Π½ΠΈΠ²Π°Π΅ΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ΅ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅ Ρ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΌ ΠΏΠΎΡΠΎΠ³ΠΎΠΌ: Π΅ΡΠ»ΠΈ ΡΠ°Π·Π»ΠΈΡΠΈΠΉ ΠΌΠ΅Π½ΡΡΠ΅, ΡΠ΅ΠΌ ΠΏΠΎΡΠΎΠ³, ΡΡΠΈΡΠ°Π΅ΠΌ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΠΎΡ ΠΎΠΆΠΈΠΌΠΈ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ Π½Π΅Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΎΡΠ»ΠΈΡΠΈΡ, Π²ΡΠΎΠ΄Π΅ ΡΡΠΌΠ° ΠΈΠ»ΠΈ ΡΠ³Π»Π°ΠΆΠΈΠ²Π°Π½ΠΈΡ.
fun assertImageSimilar(bitmap1: Bitmap, bitmap2: Bitmap, threshold: Double) { val similarity = calcSimilarity(bitmap1, bitmap2) assert(similarity > threshold) { "Images too different! Expected β₯ $threshold, actual: $similarity" } }
ΠΠΎΡΠΎΠ³ ΠΏΠΎΠ΄Π±ΠΈΡΠ°Π΅ΡΡΡ ΡΠΌΠΏΠΈΡΠΈΡΠ΅ΡΠΊΠΈ: Π΄Π»Ρ ΠΈΠΊΠΎΠ½ΠΎΠΊ β ΡΡΡΠΎΠ³ΠΎ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, 0.96), Π΄Π»Ρ ΡΠ΅Π°Π»ΡΠ½ΡΡ ΡΠΎΡΠΎ ΠΈΠ»ΠΈ ΠΎΡΡΠ΅Π½Π΄Π΅ΡΠ΅Π½Π½ΡΡ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΉ β ΠΌΡΠ³ΡΠ΅.
Π Π΅ΡΠ»ΠΈ Ρ
ΠΎΡΠΈΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π½Π΅ drawable
, Π° Π²Π΅ΡΡ View
?
ΠΠΎΠΆΠ½ΠΎ ΡΠ΅Π½Π΄Π΅ΡΠΈΡΡ View
Π² Bitmap
:
val bitmap = view.drawToBitmap()
Π ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡ Π΅Π³ΠΎ Ρ Π·Π°ΡΠ°Π½Π΅Π΅ ΡΠΎΡ ΡΠ°Π½ΡΠ½Π½ΡΠΌ ΡΡΠ°Π»ΠΎΠ½ΠΎΠΌ. ΠΡΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π»Ρ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΠΈ ΡΠ»ΠΎΠΆΠ½ΡΡ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΉ.
ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π°Π½ΠΈΠΌΠ°ΡΠΈΠΉ (Lottie)
Π‘ Lottie Π²ΡΡ ΡΠ»ΠΎΠΆΠ½Π΅Π΅. JSON ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡ Π±Π΅ΡΠΏΠΎΠ»Π΅Π·Π½ΠΎ β Π½Π°Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅Ρ Π½Π΅ ΡΡΡΡΠΊΡΡΡΠ°, Π° ΡΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ. ΠΡΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ Lottie-Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΡΠ²ΠΈΡΡΡΡ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΡΠ΅ Π°ΡΡΠ΅ΡΠ°ΠΊΡΡ. Π‘Π°ΠΌΠ° ΠΆΠ΅ Π²ΡΡΡΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±ΡΠ΅Π·Π°ΡΡΡΡ ΠΈΠ»ΠΈ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°ΡΡΡΡ. ΠΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΡΡΠΎΠΌΡ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈ Π²Π°ΠΆΠ½ΠΎΠΉ.
Π’Π°ΠΊ ΠΊΠ°ΠΊ Π°Π½ΠΈΠΌΠ°ΡΠΈΡ β ΡΡΠΎ ΡΠ΅ΡΠΈΡ ΠΊΠ°Π΄ΡΠΎΠ². ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΏΡΡΠ΅ΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π΅Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΡ .
Π§ΡΠΎ Π΄Π΅Π»Π°Π΅ΠΌ:
- ΠΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π°Π½ΠΈΠΌΠ°ΡΠΈΡ Π½Π° Π½ΡΠΆΠ½ΠΎΠΌ ΠΊΠ°Π΄ΡΠ΅:
fun BaseActions.setAnimationFrame(frame: Int) { view.perform(object : ViewAction { override fun perform(uic: UiController, view: View) { val lottieView = view as LottieAnimationView lottieView.pauseAnimation() lottieView.frame = frame } }) }
- Π‘ΡΠ°Π²Π½ΠΈΠ²Π°Π΅ΠΌ
LottieAnimationView
ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΡΠΉ View Ρ ΡΠΎΡ ΡΠ°Π½ΡΠ½Π½ΡΠΌ ΡΡΠ°Π»ΠΎΠ½ΠΎΠΌ ΡΠ΅ΡΠ΅Π· ΡΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡΠΉ Π½Π°ΠΌassertImageSimila
r.
ΠΠ°ΠΊ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΡΡΠ°Π»ΠΎΠ½Ρ?
ΠΠ»Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΡΠ°Π»ΠΎΠ½ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΡ ΠΆΠ΅ ΠΎΠ±Ρ ΠΎΠ΄ Π½ΡΠΆΠ½ΡΡ View, ΡΡΠΎ ΠΈ Π² ΡΠ΅ΡΡΠ°Ρ , ΡΠΎΠ»ΡΠΊΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° Ρ assert ΠΏΠΎΠ΄ΡΡΠ°Π²ΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² ΡΠ°ΠΉΠ».
Π’Π°ΠΊ, ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π²ΡΡΡΠ½ΡΡ Π²Π΅ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π² ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΌΡ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ ΡΡΠ°Π»ΠΎΠ½Π½ΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ β ΠΈ Π΄Π°Π»ΡΡΠ΅ ΡΠΆΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ΅ΡΡ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ Ρ Π½ΠΈΠΌΠΈ, ΡΠ±Π΅ΠΆΠ΄Π°ΡΡΡ, ΡΡΠΎ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΠΎ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎΡΡ.
ΠΡΠΎΠ³
Π€ΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΈ Π²ΡΠΎΠ΄Π΅ Espresso ΠΈ Kaspresso β Π³ΠΈΠ±ΠΊΠΈΠ΅ ΠΈ ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΡΠ°ΡΡΠΈΡΡΡΡΡΡ. ΠΠ΅ Π±ΠΎΠΉΡΠ΅ΡΡ ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΠΈ ΠΌΠ°ΡΡΠ΅ΡΡ: Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠΈΠ»ΠΈΠΉ β ΠΈ Ρ Π²Π°Ρ ΡΠΆΠ΅ Π½Π΅ ΠΊΠΎΡΡΡΠ»Ρ, Π° ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΠΈΠ΄Π΅Π°Π»ΡΠ½ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠΉ ΠΏΠΎΠ΄ Π²Π°Ρ ΠΏΡΠΎΠ΅ΠΊΡ.
ΠΡ Π½Π°ΡΡΠΈΠ»ΠΈ ΠΌΠ°ΡΠΈΠ½Ρ Π²ΠΈΠ΄Π΅ΡΡ ΡΠ°Π·Π½ΠΈΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ°ΠΌΠΈ: Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Ρ Π΄ΠΎΠΏΡΡΠΊΠΎΠΌ, ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Lottie-ΠΊΠ°Π΄ΡΠΎΠ² ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΡΡΠ°Π»ΠΎΠ½Ρ. Π Π²ΡΡ ΡΡΠΎ Π²ΡΡΡΠΎΠΈΠ»ΠΈ Π² ΠΏΡΠΈΠ²ΡΡΠ½ΡΠ΅ UI-ΡΠ΅ΡΡΡ: ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π³Π»Π°Π·Π°ΠΌΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΠ»ΠΈ β Π΄Π°Π»ΡΡΠ΅ ΠΏΡΡΡΡ ΡΡΡΠ°Π΄Π°Π΅Ρ Π°Π²ΡΠΎΡΠ΅ΡΡ.