
рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓, PSPDFKit рдХреЗ рдЗрд╡рд╛рди рд╕реНрдХреЛрд░рд┐рдХреНрд╕ рдиреЗ
MBLT DEV рд╕реЗ
рдХреЛрдЯрд▓рд┐рди рдФрд░ RxJava рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ рдПрдирд┐рдореЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдкрд░ рдмрд╛рдд рдХреА рдереАред
рдЕрдм рдореИрдВ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдХреА рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд╡реЗ рдмрд╣реБрдд рдорджрдж рдХрд░рддреЗ рд╣реИрдВред Cutscene рдХреЗ рддрд╣рдд рд░рд┐рдкреЛрд░реНрдЯ рдФрд░ рд╡реАрдбрд┐рдпреЛ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╣реИ, рдЕрдм рдЖрдк рдЗрди рдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдиреАрдореЗрд╢рди
рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ, 4 рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВ:
- ValueAnimator - рдпрд╣ рд╡рд░реНрдЧ рдЙрди рдПрдирд┐рдореЗрд╢рди рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдирд┐рдореЗрдЯреЗрдб рдорд╛рдиреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡реНрдпреВ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред
- ObjectAnimator ValueAnimator рдХрд╛ рдПрдХ рдЙрдкрд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдирд┐рдореЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
- AnimatorSet рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдиреАрдореЗрд╢рди рдЕрдиреБрдХреНрд░рдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИ:
- рд╕реНрдХреНрд░реАрди рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдкрддреНрддрд┐рдпрд╛рдВ рджреЗрдЦреЗрдВред
- рдкрд╣рд▓рд╛ рдПрдиреАрдореЗрд╢рди рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдХрд┐рд╕реА рдЕрдиреНрдп рджреГрд╢реНрдп рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрд╕реНрдерд┐рддрд┐ рдПрдиреАрдореЗрд╢рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
- ViewPropertyAnimator - рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЙрдиреНрдЪ рдФрд░ рдЪрдпрдирд┐рдд рджреГрд╢реНрдп рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИред рд╣рдо рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕ API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ RxJava рдореЗрдВ рдбрд╛рд▓реЗрдВрдЧреЗред
ValueAnimator
рдЖрдЗрдП
ValueAnimator рдврд╛рдВрдЪреЗ рдХрд╛
рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдорд╛рди рдорд╛рди рдХреЗ рд▓рд┐рдП рдХрдИ рд╢реНрд░реЗрдгреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред 0 рд╕реЗ 100 рддрдХ рдЖрджрд┐рдо рдлрд╝реНрд▓реЛрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП
ValueAnimator.ofFloatред рдЕрд╡рдзрд┐ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдФрд░ рдПрдиреАрдореЗрд╢рди рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
val animator = ValueAnimator.ofFloat(0f, 100f) animator.duration = 1000 animator.start() animator.addUpdateListener(object : ValueAnimator.AnimatorUpdateListener { override fun onAnimationUpdate(animation: ValueAnimator) { val animatedValue = animation.animatedValue as Float textView.translationX = animatedValue } })
рдпрд╣рд╛рдВ рд╣рдо
рдЕрдкрдбреЗрдЯрд▓рд┐рд╕реНрдЯ рдХреЛ
рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдбреЗрдЯ рдХреЗ рд╕рд╛рде рд╣рдо рдЕрдкрдиреЗ рд╡реНрдпреВ рдХреЛ рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ 0 рд╕реЗ 100 рддрдХ рдмрджрд▓ рджреЗрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
ObjectAnimator
рдПрдХ рдЕрдиреНрдп рдПрдиреАрдореЗрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрджрд╛рд╣рд░рдг ObjectAimimator рд╣реИ:
val objectAnimator = ObjectAnimator.ofFloat(textView, "translationX", 100f) objectAnimator.duration = 1000 objectAnimator.start()
рд╣рдо рдЙрд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рджреГрд╢реНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдорд╛рди рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рди рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрддреЗ рд╣реИрдВ рдФрд░
рд╕реЗрдЯрдбреНрдпреВрд░реЗрд╢рди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдордп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд▓рдмреНрдмреЛрд▓реБрдЖрдм рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рдореЗрдВ
рд╕реЗрдЯрдЯреНрд░рд╛рдВрд╕рд▓реЗрд╢рдирдПрдХреНрд╕ рд╡рд┐рдзрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдлрд┐рд░ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ
рдвреВрдВрдвреЗрдЧрд╛ , рдФрд░ рдлрд┐рд░ рджреГрд╢реНрдп рдПрдирд┐рдореЗрдЯреЗрдб рд╣реЛрдЧрд╛ред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
AnimatorSet
рдЕрдм
рдПрдирд┐рдореЗрдЯрд░рд╕реЗрдЯ рдХреНрд▓рд╛рд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
val bouncer = AnimatorSet() bouncer.play(bounceAnim).before(squashAnim1) bouncer.play(squashAnim1).before(squashAnim2) val fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f) fadeAnim.duration = 250 val animatorSet = AnimatorSet() animatorSet.play(bouncer).before(fadeAnim) animatorSet.start()
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдПред рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдПрдирд┐рдореЗрд╢рди рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдирд┐рдореЗрд╢рди рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмреАрдЪ рдПрдХ рджреЗрд░реА рд╕реЗрдЯ рдХрд░реЗрдВ, рдФрд░ рдЬрд┐рддрдиреЗ рдЕрдзрд┐рдХ рдПрдирд┐рдореЗрд╢рди рдЖрдк рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЙрддрдирд╛ рд╣реА рдореБрд╢реНрдХрд┐рд▓ рд╣реИред
ViewPropertyAnimator
рдЕрдВрддрд┐рдо рд╡рд░реНрдЧ
ViewPropertyAnimator рд╣реИ ред рдпрд╣ рд╡реНрдпреВ рдХреЛ рдПрдирд┐рдореЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЪрд▓рд╛рдП рдЧрдП рдПрдирд┐рдореЗрд╢рди рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдПрдкреАрдЖрдИ рд╣реИ:
ViewCompat.animate(textView) .translationX(50f) .translationY(100f) .setDuration(1000) .setInterpolator(AccelerateDecelerateInterpolator()) .setStartDelay(50) .setListener(object : Animator.AnimatorListener { override fun onAnimationRepeat(animation: Animator) {} override fun onAnimationEnd(animation: Animator) {} override fun onAnimationCancel(animation: Animator) {} override fun onAnimationStart(animation: Animator) {} })
рд╣рдо
ViewCompat.animate рдкрджреНрдзрддрд┐ рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ
ViewPropertyAnimator рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдиреАрдореЗрд╢рди
рдЯреНрд░рд╛рдВрд╕рд▓реЗрд╢рдирдПрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ рдорд╛рди рдХреЛ 50 рдХреЗ рд▓рд┐рдП,
рдЯреНрд░рд╛рдВрд╕рд▓реЗрдЯреЙрди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП 100 рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо рдПрдиреАрдореЗрд╢рди рдХреА рдЕрд╡рдзрд┐, рд╕рд╛рде рд╣реА
рдЗрдВрдЯрд░рдкреЛрд▓рд░ рдХреЛ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЗрдВрдЯрд░рдкреЛрд▓рд░ рдЙрд╕ рдХреНрд░рдо рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдирд┐рдореЗрд╢рди рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдЗрдВрдЯрд░рдкреЛрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдиреАрдореЗрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рдЧрддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЕрдВрдд рдореЗрдВ рдПрдХ рдордВрджреА рдЬреЛрдбрд╝рддрд╛ рд╣реИред рд╣рдо рдПрдиреАрдореЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рдореЗрдВ рджреЗрд░реА рднреА рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ
AnimatorListener рд╣реИ ред рдЗрд╕рдХреЗ рд╕рд╛рде, рдЖрдк рдПрдиреАрдореЗрд╢рди рдХреЗ рджреМрд░рд╛рди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдХреБрдЫ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ 4 рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ:
onAnimationStart ,
onAnimationCancel ,
onAnimationEnd ,
onAnimationRepeat ред
рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдПрдиреАрдореЗрд╢рди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдПрдкреАрдЖрдИ рд╕реНрддрд░ 16 рдореЗрдВ
рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛
.withEndAction({ //API 16+ //do something here where animation ends })
рдЗрд╕рдореЗрдВ, рдЖрдк
рд░рдирдиреЗрдмрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдиреАрдореЗрд╢рди рджрд┐рдЦрд╛рдиреЗ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЬрд╛рддреА рд╣реИред
рдЕрдм рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдПрдирд┐рдореЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ:
- рдкреНрд░рд╛рд░рдВрдн () рд╡рд┐рдзрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ: рдЬреИрд╕реЗ рд╣реА рдЖрдк рдЪреЗрддрди () рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ, рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдПрдХ рдХреНрд░рдо рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм ViewPropertyAnimator рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд┐рд╕реНрдЯрдо рдЬреИрд╕реЗ рд╣реА рдпрд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ рдПрдиреАрдореЗрд╢рди рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
- рдХреЗрд╡рд▓ рдПрдХ ViewPropertyAnimator рд╡рд░реНрдЧ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рджреГрд╢реНрдп рдХреЛ рдЪреЗрддрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдХрдИ рдПрдирд┐рдореЗрд╢рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреБрдЫ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕реА рд╕рдордп рдЖрдХрд╛рд░ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдПрдХ рдПрдирд┐рдореЗрдЯрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╣рдордиреЗ RxJava рдХреЛ рдХреНрдпреЛрдВ рдЪреБрдирд╛?
рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ рдлреАрдХрд╛ рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ:
fun fadeIn(view: View, duration: Long): Completable { val animationSubject = CompletableSubject.create() return animationSubject.doOnSubscribe { ViewCompat.animate(view) .setDuration(duration) .alpha(1f) .withEndAction { animationSubject.onComplete() } } }
рдпрд╣ рдПрдХ рдХрд╛рдлреА рдЖрджрд┐рдо рд╕рдорд╛рдзрд╛рди рд╣реИ, рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред
рд╣рдо рдПрдХ
рдХрдВрдкреЗрдЯрд┐рдмрд▓ рд╕рдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдПрдирд┐рдореЗрд╢рди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдлрд┐рд░ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░реНрд╕ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП
рдСрди-рдХрдореНтАНрдкреНтАНрд▓реАрдЯ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдПрдирд┐рдореЗрд╢рди рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рддреБрд░рдВрдд рдПрдиреАрдореЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рдХреЛрдИ рдЗрд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣, рдХрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╢реИрд▓реА рдХреЗ рдПрдирд┐рдореЗрд╢рди рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдПрдиреАрдореЗрд╢рди рдкрд░ рд╣реА рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЗрд╕рдореЗрдВ, рд╣рдо рджреГрд╢реНрдп рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ рдПрдиреАрдореЗрд╢рди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдПрдиреАрдореЗрд╢рди рдХреА рдЕрд╡рдзрд┐ рдХреЛ рднреА рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ред рдФрд░ рдЬрдм рд╕реЗ рдпрд╣ рдПрдиреАрдореЗрд╢рди рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рд╣рдореЗрдВ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ 1 рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрдЗрдП рд╣рдорд╛рд░реА рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдПрдХ рд╕рд░рд▓ рдПрдиреАрдореЗрд╢рди рдмрдирд╛рдПрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдХреНрд░реАрди рдкрд░ 4 рдмрдЯрди рд╣реИрдВ, рдФрд░ рд╣рдо рдЙрдирдХреЗ рд▓рд┐рдП 1 рд╕реЗрдХрдВрдб рдХреА рдЕрд╡рдзрд┐ рдХрд╛ рдПрдХ рдПрдиреАрдореЗрд╢рди рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
val durationMs = 1000L button1.alpha = 0f button2.alpha = 0f button3.alpha = 0f button4.alpha = 0f fadeIn(button1, durationMs) .andThen(fadeIn(button2, durationMs)) .andThen(fadeIn(button3, durationMs)) .andThen(fadeIn(button4, durationMs)) .subscribe()
рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХреЛрдб рд╣реИред
.Then рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ,
рдЖрдк рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдПрдирд┐рдореЗрд╢рди рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдм рд╣рдо рдЗрд╕реЗ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣
doOnSubscribe Event рдХреЛ
рдХрдВрдкреНрд▓реАрдЯрдЯреЗрдмрд▓ рдореЗрдВ рднреЗрдЬ рджреЗрдЧрд╛, рдЬреЛ рдПрдХреНрдЬреАрдХреНрдпреВрд╢рди рдХрддрд╛рд░ рдореЗрдВ рдкрд╣рд▓рд╛ рд╣реИред рдЗрд╕рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╡рд╣ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рджреВрд╕рд░реЗ, рддреАрд╕рд░реЗ рдФрд░ рдЗрд╕реА рддрд░рд╣ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдХрд┐рд╕реА рдЪрд░рдг рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рд╕рдВрдкреВрд░реНрдг рдЕрдиреБрдХреНрд░рдо рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдПрдиреАрдореЗрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдкрд╣рд▓реЗ рдЕрд▓реНрдлрд╛ 0 рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдмрдЯрди рдЕрджреГрд╢реНрдп рд╣реЛрдВред рдФрд░ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
рдХреЛрдЯрд▓рд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
fun View.fadeIn(duration: Long): Completable { val animationSubject = CompletableSubject.create() return animationSubject.doOnSubscribe { ViewCompat.animate(this) .setDuration(duration) .alpha(1f) .withEndAction { animationSubject.onComplete() } } }
рд╡реНрдпреВ рдХреНрд▓рд╛рд╕ рдХреЗ рд▓рд┐рдП, рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рджреЗрдЦреЗрдВ рддрд░реНрдХ рдХреЛ fadeIn рдкрджреНрдзрддрд┐ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдм рдЖрдк рдЗрд╕ рдХреЙрд▓ рдХреЛ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЙрд▓ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ
рдХреЛрдЯрд▓рд┐рди рд╕рдХреНрд╖рдо рд╣реИ
редрдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░реА рдПрдиреАрдореЗрд╢рди рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдХреЙрд▓ рдХреИрд╕реЗ рдмрджрд▓ рдЧрдИ рд╣реИ:
button1.fadeIn(durationMs) .andThen(button2.fadeIn(durationMs)) .andThen(button3.fadeIn(durationMs)) .andThen(button4.fadeIn(durationMs)) .subscribe()
рдЕрдм рдХреЛрдб рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрд╡рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдиреАрдореЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
.Then рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ,
рд╣рдо рджреВрд╕рд░реЗ, рддреАрд╕рд░реЗ рдмрдЯрди рдФрд░ рдЗрддрдиреЗ рдкрд░ рдПрдирд┐рдореЗрд╢рди рдХреА рдПрдХ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛рддреЗ рд╣реИрдВред
рд╣рдо рд╣рдореЗрд╢рд╛ рдПрдирд┐рдореЗрд╢рди рдХреА рдЕрд╡рдзрд┐ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ, рдпрд╣ рдорд╛рди рд╕рднреА рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИ - 1000 рдорд┐рд▓реАрд╕реЗрдХрдВрдбред
рдХреЛрдЯрд▓рд┐рди рдлрд┐рд░ рд╕реЗ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИред рд╣рдо рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдордп рдорд╛рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
fun View.fadeIn(duration: Long = 1000L):
рдпрджрд┐ рдЖрдк
рдЕрд╡рдзрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдордп рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ 1 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЗрд╕ рд╕рдордп рдХреЛ 2 рд╕реЗрдХрдВрдб рддрдХ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирдВрдмрд░ 2 рдкрд░ рдмрдЯрди рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ:
button1.fadeIn() .andThen(button2.fadeIn(duration = 2000L)) .andThen(button3.fadeIn()) .andThen(button4.fadeIn()) .subscribe()
рджреЛ рдПрдирд┐рдореЗрд╢рди рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ
рд╣рдо рдФрд░
рддрдм рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдПрдХ рдХреНрд░рдо рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ 2 рдПрдирд┐рдореЗрд╢рди рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
RxJava рдореЗрдВ рдПрдХ
рдорд░реНрдЬрд╡рд┐рдЯ рдСрдкрд░реЗрдЯрд░ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ
рдХрдВрдкреНрд▓реАрдЯреЗрдмрд▓ рддрддреНрд╡реЛрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдХрдерди рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрд┐рдо рддрддреНрд╡ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░
рд╡рд┐рд▓рдп рдХреЗ рд╕рд╛рде , рд╣рдореЗрдВ рдПрдХ рдПрдиреАрдореЗрд╢рди рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдмрдЯрди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрдЯрди 2 рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рд▓рдВрдмрд╛ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
button1.fadeIn() .mergeWith(button2.fadeIn(2000)) .mergeWith(button3.fadeIn()) .mergeWith(button4.fadeIn()) .subscribe()
рдЕрдм рд╣рдо рдПрдирд┐рдореЗрд╢рди рдХреЛ рдЧреНрд░реБрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдХрд╛рд░реНрдп рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрдЯрди 1 рдФрд░ рдмрдЯрди 2 рдХреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдмрдЯрди 3 рдФрд░ рдмрдЯрди рдмрдЯрди:
(button1.fadeIn().mergeWith(button2.fadeIn())) .andThen(button3.fadeIn().mergeWith(button4.fadeIn())) .subscribe()
рд╣рдо
рдорд░реНрдЬрд╡рд┐рде рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рдмрдЯрди рдХреЛ
рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ , рддреАрд╕рд░реЗ рдФрд░ рдЪреМрдереЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЗрди рд╕рдореВрд╣реЛрдВ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ
-Then рдСрдкрд░реЗрдЯрд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЕрдм рд╣рдо
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдХрд░ рдХреЛрдб рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВрдЧреЗ:
fun fadeInTogether(first: View, second: View): Completable { return first.fadeIn() .mergeWith(second.fadeIn()) }
рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рджреЛ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП fadeIn рдПрдиреАрдореЗрд╢рди рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдПрдиреАрдореЗрд╢рди рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреИрд╕реЗ рдмрджрд▓ рдЧрдИ рд╣реИ:
fadeInTogether(button1, button2) .andThen(fadeInTogether(button3, button4)) .subscribe()
рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдиреАрдореЗрд╢рди рд╣реИ:
рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдореЗрдВ рдХреБрдЫ рджреЗрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдПрдиреАрдореЗрд╢рди рджрд┐рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЕрдВрддрд░рд╛рд▓ рдХрдерди рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреА:
fun animate() { val timeObservable = Observable.interval(100, TimeUnit.MILLISECONDS) val btnObservable = Observable.just(button1, button2, button3, button4) }
рдпрд╣ рд╣рд░ 100 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХрд╛ рдорд╛рди рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдмрдЯрди 100 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдЕрдЧрд▓рд╛, рд╣рдо рдПрдХ рдФрд░ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдмрдЯрди рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░реЗрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 4 рдмрдЯрди рд╣реИрдВред рд╣рдо
рдЬрд┐рдк рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдШрдЯрдирд╛рдУрдВ рдХреА рдзрд╛рд░рд╛рдПрдБ рд╣реЛрдВ:
Observable.zip(timeObservable, btnObservable, BiFunction<Long, View, Disposable> { _, button -> button.fadeIn().subscribe() })
рдкрд╣рд▓рд╛
рдЯрд╛рдЗрдордСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рд╕реЗ рдореЗрд▓
рдЦрд╛рддрд╛ рд╣реИ ред рдпрд╣
рд╡реЗрдзрд╢рд╛рд▓рд╛ рдирд┐рдпрдорд┐рдд рдЕрдВрддрд░рд╛рд▓ рдкрд░ рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧреАред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдпрд╣ 100 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд╣реЛрдЧрд╛ред
рджреВрд╕рд░рд╛
рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдПрдХ рджреГрд╢реНрдп рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред
рдЬрд┐рдк рдСрдкрд░реЗрдЯрд░ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдкрд╣рд▓реА рд╡рд╕реНрддреБ рдкрд╣рд▓реЗ рдзрд╛рдЧреЗ рдореЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреА рд╣реИ, рдФрд░ рдЗрд╕реЗ рджреВрд╕рд░реЗ рдзрд╛рдЧреЗ рд╕реЗ рдкрд╣рд▓реА рд╡рд╕реНрддреБ рд╕реЗ рдЬреЛрдбрд╝рддреА рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рджреВрд╕рд░реЗ рдзрд╛рдЧреЗ рдореЗрдВ рдпреЗ рд╕рднреА 4 рд╡рд╕реНрддреБрдПрдВ рддреБрд░рдВрдд рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреА, рд╡рд╣ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧреА, рдЬрдм рддрдХ рдХрд┐ рд╡рд╕реНрддреБрдПрдВ рдкрд╣рд▓реЗ рдзрд╛рдЧреЗ рдореЗрдВ рджрд┐рдЦрд╛рдИ рди рджреЗрдиреЗ рд▓рдЧреЗрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкрд╣рд▓реА рдзрд╛рд░рд╛ рд╕реЗ рдкрд╣рд▓реА рд╡рд╕реНрддреБ рд╣рдорд╛рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд░реВрдк рдореЗрдВ рджреВрд╕рд░реА рд╕реЗ рдкрд╣рд▓реА рд╡рд╕реНрддреБ рд╕реЗ рдЬреБрдбрд╝реЗрдЧреА, рдФрд░ рдмрд╛рдж рдореЗрдВ 100 рдорд┐рд▓реАрд╕реЗрдХрдВрдб, рдЬрдм рдХреЛрдИ рдирдИ рд╡рд╕реНрддреБ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА, рддреЛ рдСрдкрд░реЗрдЯрд░ рдЗрд╕реЗ рджреВрд╕рд░реА рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рджреГрд╢реНрдп рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рджреЗрд░реА рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред
рдЖрдЗрдП
RxJava рдореЗрдВ
BiFinction рд╕реЗ
рдирд┐рдкрдЯрддреЗ рд╣реИрдВ ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЙрди рдкрд░ рдХреБрдЫ рдСрдкрд░реЗрд╢рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рддреАрд╕рд░реА рд╡рд╕реНрддреБ рджреЗрддрд╛ рд╣реИред рд╣рдо рд╕рдордп рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг
рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо
fadeIn рдПрдиреАрдореЗрд╢рди рдХрд╣рддреЗ рд╣реИрдВ рдФрд░ рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП
рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ ред рд╕рдордп рдХрд╛ рдореВрд▓реНрдп рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдпрд╣ рдПрдиреАрдореЗрд╢рди рдорд┐рд▓рддрд╛ рд╣реИ:
VanGogh
рдореИрдВ рдЖрдкрдХреЛ рдЙрд╕
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдЬрд┐рд╕реЗ рдЗрд╡рд╛рди рдиреЗ MBLT DEV 2017 рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛ред
рдЗрд╡рд╛рди рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдирд┐рдореЗрд╢рди рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЧреЛрд▓реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдЗрд╕рдХреЗ рдКрдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ рд░реЗрдбреАрдореЗрдб рдПрдирд┐рдореЗрд╢рди рднреА рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдПрдирд┐рдореЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕реЗрдЯ рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдШрдЯрдХ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧреАред
рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
fun fadeIn(view:View) : AnimationCompletable { return AnimationBuilder.forView(view) .alpha(1f) .duration(2000L) .build().toCompletable() }
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдПрдХ рдПрдиреАрдореЗрд╢рди рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреЛ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рдПрдХ
рдХрдВрдкреНрд▓реАрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмрдЬрд╛рдп рдПрдХ
рдПрдиреАрдореЗрд╢рди рдХреЙрдордкреНрд▓реЗрдмрд▓ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╡рд░реНрдЧ рдХрдВрдкреНрд▓реАрдЯрдЯреЗрдмрд▓ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдм рдЕрдзрд┐рдХ рдХрд╛рд░реНрдп рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдкрд┐рдЫрд▓реЗ рдХреЛрдб рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рдереА рдХрд┐ рдПрдирд┐рдореЗрд╢рди рдХреЛ рд░рджреНрдж рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдерд╛ред рдЕрдм рдЖрдк рдПрдХ
рдПрдиреАрдореЗрд╢рдирдХреЙрдордЯреЗрдмрд▓рдЯреЗрдмрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдиреАрдореЗрд╢рди рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╣реА рд╣рдо рдЗрд╕рд╕реЗ рдЕрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ - рдПрдирд┐рдореЗрд╢рдирдмреНрдпреВрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЙрднрд░рддрд╛ рд╣реБрдЖ рдПрдиреАрдореЗрд╢рди рдмрдирд╛рдПрдВред рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдХрд┐ рдХрд┐рд╕ рджреГрд╢реНрдп рдкрд░ рдПрдиреАрдореЗрд╢рди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рд╡рд░реНрдЧ
ViewPropertyAnimator рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рдПрдХ рд╕реНрдЯреНрд░реАрдо рд╣реИред
рдЕрдЧрд▓рд╛, рдЕрд▓реНрдлрд╛ 1 рдПрдл рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЕрд╡рдзрд┐ 2 рд╕реЗрдХрдВрдб рд╣реИред рдлрд┐рд░ рд╣рдо рдПрдиреАрдореЗрд╢рди рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВред рдЬреИрд╕реЗ рд╣реА рд╣рдо
рдмрд┐рд▓реНрдб рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ
рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ , рдПрдиреАрдореЗрд╢рди рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рд╣рдо рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡рд╕реНрддреБ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдПрдирд┐рдореЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЗрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЗрд╕рдХреЗ рд▓реЙрдиреНрдЪ рдХреЗ рд▓рд┐рдП рдмрдЪрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдПрдиреАрдореЗрд╢рди рд╕реНрд╡рдпрдВ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдХреЙрдордкреНтАНрд▓реЗрдХреНтАНрдЯреЗрдмрд▓ рдХреЛ рдХреЙрд▓
рдХрд░реЗрдВ , рдЬреЛ рдПрдХ
рдРрдирд┐рдореЗрд╢рдирдХрдВрдкреНтАНрд▓рд╛рдИрдЯреЗрдмрд▓ рдмрдирд╛рдПрдЧрд╛ред рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реЗрд▓ рдореЗрдВ рдЗрд╕ рдПрдиреАрдореЗрд╢рди рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд▓рдкреЗрдЯ рджреЗрдЧрд╛, рдФрд░ рдЬреИрд╕реЗ рд╣реА рдЖрдк рдЗрд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВрдЧреЗ, рдпрд╣ рдПрдиреАрдореЗрд╢рди рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдПрдиреАрдореЗрд╢рди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЕрдм рдЖрдк рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдСрдкрд░реЗрдЯрд░
doOnAnimationReady ,
doOnAnimationStart ,
doOnAnimationEnd рдФрд░ рдЬреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
fun fadeIn(view:View) : AnimationCompletable { return AnimationBuilder.forView(view) .alpha(1f) .duration(2000L) .buildCompletable() .doOnAnimationReady { view.alpha = 0f } }
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдПрдирд┐рдореЗрд╢рдирдмреНрдпреВрд▓реЗрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдФрд░ рдПрдиреАрдореЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдорд╛рд░реЗ рджреГрд╢реНрдп рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред
рд░рд┐рдкреЛрд░реНрдЯ рд╡реАрдбрд┐рдпреЛ
рд╣рдордиреЗ рдХреЛрдЯрд▓рд┐рди рдФрд░ RxJava рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдирд┐рдореЗрд╢рди рдмрдирд╛рдиреЗ, рдмрдирд╛рдиреЗ рдФрд░ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рджреЗрдЦрд╛ред рдпрд╣рд╛рдВ рдПрдХ
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдПрдирд┐рдореЗрд╢рди рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдЧреЛрд▓реЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рдПрдХ рд╡реАрдбрд┐рдпреЛ рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реВрдВ:
рд╕реНрдкреАрдХрд░ MBLT DEV 2018
MBLT DEV 2018 рд╕реЗ рдкрд╣рд▓реЗ, рджреЛ рдорд╣реАрдиреЗ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕рдордп рд╢реЗрд╖ рд╣реИред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдВрдЧреЗ:
- рд▓реЙрд░рд╛ рдореЛрд░рд┐рдирд┐рдЧреЛ, Google рдбреЗрд╡рд▓рдкрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ
- рдХреМрд╢рд┐рдХ рдЧреЛрдкрд╛рд▓, рдЦрдВрдбрд┐рдд рдкреЛрдбрдХрд╛рд╕реНрдЯ рдХреЗ рд▓реЗрдЦрдХ
- рдЕрд░рдЯреЛрдо рд░реБрджреЛрдИ, рд╕рдЧрд╛рдИ
- рджреАрдирд╛ рд╕рд┐рджреЛрд░реЛрд╡рд╛, Google, рдФрд░ рдЕрдиреНрдп ред
рдХрд▓ рдЯрд┐рдХрдЯ рдХреА рдХреАрдордд рдмрджрд▓ рдЬрд╛рдПрдЧреАред рдЖрдЬ рд╣реА
рдкрдВрдЬреАрдХрд░рдг рдХрд░реЗрдВ ред