ΠΡΠ° ΡΡΠ°ΡΡΡ Π΄Π»Ρ Android-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ².
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Animator?
Π‘ΡΠ°ΡΡΡ Π±ΡΠ»Π° Π²ΠΏΠ΅ΡΠ²ΡΠ΅ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π° Π·Π΄Π΅ΡΡ.
ΠΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΡΠΎΡΠΈΠΈ. Π‘ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π·Π°ΠΏΡΡΠΊΠ° ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ Android ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π» ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ View Animation. ΠΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ°Π»ΡΡ ΠΎΠ½, ΠΊΠ°ΠΊ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΠ· Π½Π°Π·Π²Π°Π½ΠΈΡ, Π΄Π»Ρ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΉ. ΠΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΡΡΡΠΎΠΉΡΡΠ² Π² ΠΊΠΎΠ½ΡΠ΅ Π½ΡΠ»Π΅Π²ΡΡ Π±ΡΠ»Π° Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ Π½ΠΈΠ·ΠΊΠΎΠΉ, ΡΡΠΎ ΠΎ ΠΊΡΠ°ΡΠΈΠ²ΡΡ Π°Π½ΠΈΠΌΠ°ΡΠΈΡΡ Π½ΠΈΠΊΡΠΎ ΠΎΡΠΎΠ±ΠΎ Π½Π΅ Π΄ΡΠΌΠ°Π», ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ Π½Π΅ Π±ΡΠ» ΡΠ΄ΠΎΠ±Π½ΡΠΌ ΠΈ Π³ΠΈΠ±ΠΊΠΈΠΌ. ΠΠ½ ΠΈΠΌΠ΅Π» ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΡΡΠ΅ ΡΠΈΠΏΠ° Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ (TranslateAnimation, AlphaAnimation, ScaleAnimation, RotateAnimation), ΠΊΠ»Π°ΡΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΠΈΡ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°ΡΡ (AnimationSet), Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΊΠ»Π°ΡΡΠ°ΠΌΠΈ, ΡΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΎΡ View.
Π Android 3.0 ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ ΠΊΡΠ΄Π° Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΉ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ Property Animation. ΠΠ½ ΡΠΌΠ΅Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ Π»ΡΠ±ΠΎΠ΅ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π»ΡΠ±ΡΠΌΠΈ ΠΊΠ»Π°ΡΡΠ°ΠΌΠΈ. ΠΠ³ΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ Animator.
Animator β ΡΡΠΎ ΡΠΈΠΏ ΠΊΠ»Π°ΡΡΠΎΠ², ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΡ Π΄Π»Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΡΡΠ±ΠΎ Π³ΠΎΠ²ΠΎΡΡ, ΡΡΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠΌ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΎΡ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌΡ. Π’Π°ΠΊΠΈΠΌ ΠΏΠ»Π°Π²Π½ΠΎ ΠΌΠ΅Π½ΡΡΡΠΈΠΌΡΡ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎΠΌ Π² Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎΡΡΡ.
ΠΠ»Π°ΡΡΡ, ΡΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΎΡ Animator
ValueAnimator (Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΡΡΡ ΠΎΡ Animator)
Π ΡΠ°ΠΌΠΎΠΌ ΠΏΡΠΎΡΡΠΎΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅ ΠΌΡ Π·Π°Π΄Π°ΡΠΌ ΡΡΠΎΠΌΡ ΠΊΠ»Π°ΡΡΡ ΡΠΈΠΏ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ. Π ΠΎΡΠ²Π΅Ρ Π½Π°ΠΌ Π±ΡΠ΄ΡΡ ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΡΡ ΡΠΎΠ±ΡΡΠΈΡ Π½Π° Π½Π°ΡΠ°Π»ΠΎ, ΠΊΠΎΠ½Π΅Ρ, ΠΏΠΎΠ²ΡΠΎΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΡΠΌΠ΅Π½Ρ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ ΠΈ Π΅ΡΡ Π½Π° Π΄Π²Π° ΡΠΎΠ±ΡΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°Π΄Π°ΡΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ Π΄Π»Ρ ΠΏΠ°ΡΠ·Ρ ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. Π‘ΠΎΠ±ΡΡΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΠΏΠΎΠΆΠ°Π»ΡΠΉ, ΡΠ°ΠΌΠΎΠ΅ Π²Π°ΠΆΠ½ΠΎΠ΅: Π² Π½Π΅Π³ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΠ½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΡ ΠΈ Π±ΡΠ΄Π΅ΠΌ ΠΌΠ΅Π½ΡΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ².
ΠΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ alpha Ρ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡΡΡ:
ValueAnimator animator = ValueAnimator.ofFloat(0, 1);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
view.setAlpha((Float) animation.getAnimatedValue());
}
});
animator.start();
ObjectAnimator, Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΡΡΡ ΠΎΡ ValueAnimator
ΠΡΠΎ ΠΊΠ»Π°ΡΡ, ΠΏΡΠΈΠ·Π²Π°Π½Π½ΡΠΉ ΡΠΏΡΠΎΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ Ρ ValueAnimator. Π‘ Π½ΠΈΠΌ Π²Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π²ΡΡΡΠ½ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΎΠ±ΡΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ β Π²Ρ ΠΏΡΠΎΡΡΠΎ Π΄Π°ΡΡΠ΅ AnimatorβΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΠ΅ ΠΏΠΎΠ»Π΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ scaleX. Π‘ ΠΏΠΎΠΌΠΎΡΡΡ Java Refliction ΠΈΡΠ΅ΡΡΡ setter Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ»Ρ (Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ β setScaleX. ΠΠ°Π»Π΅Π΅ Animator ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΌΠ΅Π½ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ»Ρ.
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ObjectAnimator ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ alpha Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ°ΠΊ:
ObjectAnimator.ofFloat(view, View.ALPHA, 0, 1).start();
Π£ ΠΊΠ»Π°ΡΡΠ° View Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ²ΠΎΠΉΡΡΠ² ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΡ Π΄Π»Ρ Π°Π½ΠΈΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Animator:
- ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎΡΡΡ (View.ALPHA)
- ΠΌΠ°ΡΡΡΠ°Π± (View.SCALE_X, View.SCALE_Y)
- Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ (View.ROTATION, View.ROTATION_X, View.ROTATION_Y)
- ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (View.X, View.Y, View.Z)
- ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΠΎΠΉ ΡΠ°ΡΡΠΈ (View.TRANSLATION_X, View.TRANSLATION_Y, View.TRANSLATION_Z)
AnimatorSet (Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΡΡΡ ΠΎΡ Animator)
ΠΡΠΎ ΠΊΠ»Π°ΡΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°ΡΡ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ: Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ ΠΈ Ρ.Π΄.
ViewPropertyAnimator
ΠΡΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ. ΠΠ½ Π½Π΅ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΡΡΡ ΠΎΡ Animator, Π½ΠΎ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ ΡΠΎΠΉ ΠΆΠ΅ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ, ΡΡΠΎ ΠΈ ObjectAnimator Π΄Π»Ρ View, ΠΈ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ Π»ΡΠ³ΠΊΠΎΠ³ΠΎ Π°Π½ΠΈΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ View Π±Π΅Π· Π»ΠΈΡΠ½ΠΈΡ
Π·Π°ΠΌΠΎΡΠΎΡΠ΅ΠΊ.
ΠΠΎΡ ΡΠ°ΠΊ Ρ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ alpha:
view.animate().alphaBy(0).alpha(1).start();
ΠΠ°ΠΊ ΠΌΡ Π½Π°ΡΠ°Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Animator
ΠΠΊΠΎΠ»ΠΎ Π³ΠΎΠ΄Π° Π½Π°Π·Π°Π΄ ΠΏΠ΅ΡΠ΅Π΄ΠΎ ΠΌΠ½ΠΎΠΉ Π²ΡΡΠ°Π»Π° Π·Π°Π΄Π°ΡΠ° ΡΠ΄Π΅Π»Π°ΡΡ Π°Π½ΠΈΠΌΠ°ΡΠΈΡ ΠΏΡΠΈ ΠΊΠ»ΠΈΠΊΠ΅ Π½Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ. ΠΠΎΡ ΡΠ°ΠΊΡΡ:
ΠΠ΅ ΡΠΎ ΡΡΠΎΠ±Ρ Ρ Π½Π΅ Π΄Π΅Π»Π°Π» Π°Π½ΠΈΠΌΠ°ΡΠΈΠΉ ΠΏΡΠ΅ΠΆΠ΄Π΅, Π½ΠΎ Π½Π° Π°ΡΡΡΠΎΡΡΠ΅ ΠΎΠ½ΠΈ ΡΠ΅Π΄ΠΊΠΎ Π½ΡΠΆΠ½Ρ. ΠΠΎΡΡΠΎΠΌΡ Ρ Π·Π°Π³ΡΠ³Π»ΠΈΠ» Animation Android. ΠΠ΅ΡΠ²ΡΠ΅ ΠΏΡΡΡ ΡΡΡΠ»ΠΎΠΊ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΡΠ²Π°Π»ΠΈ, ΠΊΠ°ΠΊ Π΄Π΅Π»Π°ΡΡΡΡ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ, ΠΈ Ρ ΠΏΡΠΈΡΡΡΠΏΠΈΠ». ΠΠΎΡ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ:
ΠΠΎΠ΄ Animation
public static void likeAnimation(@DrawableRes int icon,
final ImageView imageView) {
imageView.setImageResource(icon);
imageView.setVisibility(View.VISIBLE);
AlphaAnimation showAlphaAnimation = new AlphaAnimation(0.0f, 1.0f);
showAlphaAnimation.setDuration(SHOW_DURATION);
ScaleAnimation showScaleAnimation = new ScaleAnimation(0.2f, 1.4f, 0.2f, 1.4f,
android.view.animation.Animation.RELATIVE_TO_SELF, 0.5f,
android.view.animation.Animation.RELATIVE_TO_SELF, 0.5f);
showScaleAnimation.setDuration(SHOW_DURATION);
AnimationSet showAnimationSet = new AnimationSet(false);
showAnimationSet.addAnimation(showAlphaAnimation);
showAnimationSet.addAnimation(showScaleAnimation);
showAnimationSet.setAnimationListener(new OnEndAnimationListener() {
@Override
public void onAnimationEnd(android.view.animation.Animation animation) {
ScaleAnimation toNormalScaleAnimation = new ScaleAnimation(1.4f, 1.0f, 1.4f, 1.0f,
android.view.animation.Animation.RELATIVE_TO_SELF, 0.5f,
android.view.animation.Animation.RELATIVE_TO_SELF, 0.5f);
toNormalScaleAnimation.setDuration(TO_NORMAL_DURATION);
toNormalScaleAnimation.setAnimationListener(new OnEndAnimationListener() {
@Override
public void onAnimationEnd(android.view.animation.Animation animation) {
AlphaAnimation hideAlphaAnimation = new AlphaAnimation(1.0f, 0.0f);
hideAlphaAnimation.setDuration(HIDE_DURATION);
ScaleAnimation hideScaleAnimation = new ScaleAnimation(1.0f, 0.2f, 1.0f, 0.2f,
android.view.animation.Animation.RELATIVE_TO_SELF, 0.5f,
android.view.animation.Animation.RELATIVE_TO_SELF, 0.5f);
hideScaleAnimation.setDuration(HIDE_DURATION);
AnimationSet hideAnimationSet = new AnimationSet(false);
hideAnimationSet.setStartOffset(HIDE_DELAY);
hideAnimationSet.addAnimation(hideAlphaAnimation);
hideAnimationSet.addAnimation(hideScaleAnimation);
hideAnimationSet.setAnimationListener(new OnEndAnimationListener() {
@Override
public void onAnimationEnd(android.view.animation.Animation animation) {
imageView.setVisibility(View.GONE);
}
});
imageView.startAnimation(hideAnimationSet);
}
});
imageView.startAnimation(toNormalScaleAnimation);
}
});
imageView.startAnimation(showAnimationSet);
}
ΠΠΎΠ΄ ΠΏΠΎΠ»ΡΡΠΈΠ»ΡΡ ΠΌΠ°Π»ΠΎΠΏΠΎΠ½ΡΡΠ½ΡΠΌ, ΡΡΠΎ ΠΏΠΎΠ΄ΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΎ ΠΌΠ΅Π½Ρ ΠΊ ΠΏΠΎΠΈΡΠΊΠ°ΠΌ ΠΈΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° Π² ΡΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΉ. Π Π΅ΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ»ΠΎ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Π½Π° StackOveflow. ΠΠ΄Π΅Ρ ΡΠ°ΠΊΠ°Ρ: ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΉ ΠΊΠ°ΠΆΠ΄ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΡΡ Π°Π½ΠΈΠΌΠ°ΡΠΈΡ Π² AnimationSet ΡΠΎ ΡΠ΄Π²ΠΈΠ³ΠΎΠΌ, ΡΠ°Π²Π½ΡΠΌ ΡΡΠΌΠΌΠ΅ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠ΅ΠΉ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΉ. ΠΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ Π³ΠΎΡΠ°Π·Π΄ΠΎ Π»ΡΡΡΠ΅, ΡΠ΅ΠΌ Π±ΡΠ»ΠΎ:
AnimationSet:
public static void likeAnimation(@DrawableRes int icon,
final ImageView imageView) {
imageView.setImageResource(icon);
imageView.setVisibility(View.VISIBLE);
AnimationSet animationSet = new AnimationSet(false);
animationSet.addAnimation(showAlphaAnimation());
animationSet.addAnimation(showScaleAnimation());
animationSet.addAnimation(toNormalScaleAnimation());
animationSet.addAnimation(hideAlphaAnimation());
animationSet.addAnimation(hideScaleAnimation());
animationSet.setAnimationListener(new OnEndAnimationListener() {
@Override
public void onAnimationEnd(Animation animation) {
imageView.setVisibility(View.GONE);
}
});
imageView.startAnimation(animationSet);
}
private static Animation showAlphaAnimation() {
AlphaAnimation showAlphaAnimation = new AlphaAnimation(0.0f, 1.0f);
showAlphaAnimation.setDuration(SHOW_DURATION);
return showAlphaAnimation;
}
private static Animation showScaleAnimation() {
ScaleAnimation showScaleAnimation = new ScaleAnimation(
0.2f, 1.4f, 0.2f, 1.4f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
showScaleAnimation.setDuration(SHOW_DURATION);
return showScaleAnimation;
}
private static Animation toNormalScaleAnimation() {
ScaleAnimation toNormalScaleAnimation = new ScaleAnimation(
1.4f, 1.0f, 1.4f, 1.0f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
toNormalScaleAnimation.setDuration(TO_NORMAL_DURATION);
toNormalScaleAnimation.setStartOffset(SHOW_DURATION);
return toNormalScaleAnimation;
}
private static Animation hideAlphaAnimation() {
AlphaAnimation hideAlphaAnimation = new AlphaAnimation(1.0f, 0.0f);
hideAlphaAnimation.setDuration(HIDE_DURATION);
hideAlphaAnimation.setStartOffset(SHOW_DURATION + TO_NORMAL_DURATION + HIDE_DELAY);
return hideAlphaAnimation;
}
private static Animation hideScaleAnimation() {
ScaleAnimation hideScaleAnimation = new ScaleAnimation(
1.0f, 0.2f, 1.0f, 0.2f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
hideScaleAnimation.setDuration(HIDE_DURATION);
hideScaleAnimation.setStartOffset(SHOW_DURATION + TO_NORMAL_DURATION + HIDE_DELAY);
return hideScaleAnimation;
}
ΠΠΎΠ΄ ΡΡΠ°Π» ΠΏΠΎΠ½ΡΡΠ½Π΅Π΅ ΠΈ ΡΠΈΡΠ°Π±Π΅Π»ΡΠ½Π΅Π΅, Π½ΠΎ Π΅ΡΡΡ ΠΎΠ΄Π½ΠΎ Β«Π½ΠΎΒ»: ΡΠ»Π΅Π΄ΠΈΡΡ Π·Π° ΡΠ΄Π²ΠΈΠ³ΠΎΠΌ Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π½Π΅ΡΠ΄ΠΎΠ±Π½ΠΎ Π΄Π°ΠΆΠ΅ Π² ΡΠ°ΠΊΠΎΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. ΠΡΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π΅ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π³ΠΎΠ², ΡΠΎ ΡΡΠΎ ΡΡΠ°Π½Π΅Ρ ΠΏΠΎΡΡΠΈ Π½Π΅Π²ΡΠΏΠΎΠ»Π½ΠΈΠΌΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ. Π’Π°ΠΊΠΆΠ΅ Π²Π°ΠΆΠ½ΡΠΌ ΠΌΠΈΠ½ΡΡΠΎΠΌ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° ΡΡΠ°Π»ΠΎ ΡΡΡΠ°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ: ΡΠ°Π·ΠΌΠ΅Ρ Π°Π½ΠΈΠΌΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΏΠΎ Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΡΠΌ Π΄Π»Ρ ΠΌΠ΅Π½Ρ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ, Π±ΡΠ» Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ ΠΏΡΠΈ ΠΎΠ±ΡΡΠ½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΉ. ΠΠΎΠΏΡΡΠΊΠΈ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Π½ΠΈ ΠΊ ΡΠ΅ΠΌΡ Π½Π΅ ΠΏΡΠΈΠ²Π΅Π»ΠΈ, Π° Π²Π½ΠΈΠΊΠ°ΡΡ Π³Π»ΡΠ±ΠΆΠ΅ Ρ ΡΠΆΠ΅ Π½Π΅ ΡΡΠ°Π» β ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΌΠ½Π΅ Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π½Π΅ Π½ΡΠ°Π²ΠΈΠ»ΡΡ. ΠΠΎ Ρ ΡΠ΅ΡΠΈΠ» ΡΠ°Π·Π²ΠΈΡΡ ΡΡΡ ΠΈΠ΄Π΅Ρ ΠΈ ΡΠ°Π·Π±ΠΈΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π³ Π½Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ AnimatorSet. ΠΠΎΡ ΡΡΠΎ Π²ΡΡΠ»ΠΎ:
AnimatorSet Π² AnimatorSet
public static void likeAnimation(@DrawableRes int icon,
final ImageView imageView) {
imageView.setImageResource(icon);
imageView.setVisibility(View.VISIBLE);
AnimationSet animationSet = new AnimationSet(false);
animationSet.addAnimation(showAnimationSet());
animationSet.addAnimation(toNormalAnimationSet());
animationSet.addAnimation(hideAnimationSet());
animationSet.setAnimationListener(new OnEndAnimationListener() {
@Override
public void onAnimationEnd(Animation animation) {
imageView.setVisibility(View.GONE);
}
});
imageView.startAnimation(animationSet);
}
private static AnimationSet showAnimationSet() {
AlphaAnimation showAlphaAnimation = new AlphaAnimation(0.0f, 1.0f);
ScaleAnimation showScaleAnimation = new ScaleAnimation(
0.2f, 1.4f, 0.2f, 1.4f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
AnimationSet set = new AnimationSet(false);
set.addAnimation(showAlphaAnimation);
set.addAnimation(showScaleAnimation);
set.setDuration(SHOW_DURATION);
return set;
}
private static AnimationSet toNormalAnimationSet() {
ScaleAnimation toNormalScaleAnimation = new ScaleAnimation(
1.4f, 1.0f, 1.4f, 1.0f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
AnimationSet set = new AnimationSet(false);
set.addAnimation(toNormalScaleAnimation);
set.setDuration(TO_NORMAL_DURATION);
set.setStartOffset(SHOW_DURATION);
return set;
}
private static AnimationSet hideAnimationSet() {
AlphaAnimation hideAlphaAnimation = new AlphaAnimation(1.0f, 0.0f);
ScaleAnimation hideScaleAnimation = new ScaleAnimation(
1.0f, 0.2f, 1.0f, 0.2f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
AnimationSet set = new AnimationSet(false);
set.setDuration(HIDE_DURATION);
set.addAnimation(hideAlphaAnimation);
set.addAnimation(hideScaleAnimation);
set.setStartOffset(SHOW_DURATION + TO_NORMAL_DURATION + HIDE_DELAY);
return set;
}
ΠΠ΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½Π°Ρ ΡΠ°Π±ΠΎΡΠ° Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ, ΠΏΠ»ΠΎΡ
ΠΎΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄, Π²ΡΡ ΠΏΠ»ΠΎΡ
ΠΎ. ΠΠ½ΠΎΠ²Ρ Ρ ΠΎΠ±ΡΠ°ΡΠΈΠ»ΡΡ ΠΊ Google, ΠΈ Π½Π°ΡΠΊΠ½ΡΠ»ΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ Animation ΡΠΆΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Legacy code, ΡΠΎ Π΅ΡΡΡ ΡΡΡΠ°ΡΠ΅Π» ΠΈ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ, Ρ
ΠΎΡΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ.
Π― ΠΏΠΎΠ½ΡΠ», ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΠΈΠ½Π°ΡΠ΅. Π Π²ΠΎΡ Π½Π° ΠΏΡΠΎΡΡΠΎΡΠ°Ρ
Android Developers Ρ Π½Π°ΡΠΊΠ½ΡΠ»ΡΡ Π½Π° Animator. ΠΠΎΠΏΡΡΠΊΠ° ΡΠ΄Π΅Π»Π°ΡΡ Π°Π½ΠΈΠΌΠ°ΡΠΈΡ Ρ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡΡΡ Π²ΡΠ³Π»ΡΠ΄Π΅Π»Π° ΡΠ°ΠΊ:
Animator
public static void likeAnimation(@DrawableRes int icon,
final ImageView view) {
if (view != null && !isAnimate) {
AnimatorSet set = new AnimatorSet();
set.playSequentially(
showAnimatorSet(view),
toNormalAnimatorSet(view),
hideAnimatorSet(view));
set.addListener(getLikeEndListener(view, icon));
set.start();
}
view.animate().alphaBy(0).alpha(1).start();
}
private static AnimatorListenerAdapter getLikeEndListener(final ImageView view, final int icon) {
return new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
isAnimate = true;
view.setVisibility(View.VISIBLE);
view.setImageResource(icon);
view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
}
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
isAnimate = false;
view.setVisibility(View.GONE);
view.setImageDrawable(null);
view.setLayerType(View.LAYER_TYPE_NONE, null);
}
};
}
private static AnimatorSet showAnimatorSet(View view) {
AnimatorSet set = new AnimatorSet();
set.setDuration(SHOW_DURATION).playTogether(
ObjectAnimator.ofFloat(view, View.ALPHA, 0f, 1f),
ObjectAnimator.ofFloat(view, View.SCALE_X, 0.2f, 1.4f),
ObjectAnimator.ofFloat(view, View.SCALE_Y, 0.2f, 1.4f)
);
return set;
}
private static AnimatorSet toNormalAnimatorSet(View view) {
AnimatorSet set = new AnimatorSet();
set.setDuration(TO_NORMAL_DURATION).playTogether(
ObjectAnimator.ofFloat(view, View.SCALE_X, 1.4f, 1f),
ObjectAnimator.ofFloat(view, View.SCALE_Y, 1.4f, 1f)
);
return set;
}
private static AnimatorSet hideAnimatorSet(View view) {
AnimatorSet set = new AnimatorSet();
set.setDuration(HIDE_DURATION).playTogether(
ObjectAnimator.ofFloat(view, View.ALPHA, 1f, 0f),
ObjectAnimator.ofFloat(view, View.SCALE_X, 1f, 0.2f),
ObjectAnimator.ofFloat(view, View.SCALE_Y, 1f, 0.2f)
);
set.setStartDelay(HIDE_DELAY);
return set;
}
ΠΠ½ΠΈΠΌΠ°ΡΠΈΡ ΡΠ°Π±ΠΎΡΠ°Π»Π° Π±Π΅Π·ΡΠΏΡΠ΅ΡΠ½ΠΎ, Π° Π·Π½Π°ΡΠΈΡ, ΠΏΠΎΠΈΡΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΈΡΠ°ΡΡ ΠΎΠΊΠΎΠ½ΡΠ΅Π½Π½ΡΠΌΠΈ. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅, ΡΡΠΎ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ Animator Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡΡ, Π½Π΅ Π·Π°ΠΏΡΡΠ΅Π½ Π»ΠΈ ΡΠΆΠ΅ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Animator Π΄Π»Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ view, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠ°ΡΡΠΉ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡ, ΠΊΠ°ΠΊ Π½ΠΈ Π² ΡΠ΅ΠΌ Π½Π΅ Π±ΡΠ²Π°Π»ΠΎ.
ΠΠ»ΡΠ±ΠΆΠ΅ Π² Animator
Π― Π½Π°ΡΠ°Π» ΠΏΠΎΠΈΡΠΊΠΈ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π΅ΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Animator. ΠΠΎΠ»ΡΡ ΠΌΡΡΠ»ΠΈ ΠΏΡΠΈΠ²ΡΠ» ΠΌΠ΅Π½Ρ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ:
ΠΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ΅ΡΡΡΠ΅ Animatorβa:
- ΠΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ Π·Π°ΠΏΡΡΠΊ
AnimatorSet showHideSet = new AnimatorSet();
showHideSet.playTogether(
ScrollAnimatorUtils.translationYAnimator(translationY, footerButtons),
ScrollAnimatorUtils.translationYAnimator(translationY, footerText),
ScrollAnimatorUtils.scrollAnimator(startScroll, endScroll, scrollView),
ScrollAnimatorUtils.alphaAnimator(1, 0, recyclerView)
);
showHideSet.start();
1. Π΄Π²ΠΈΠ³Π°Π΅Ρ Π²Π½ΠΈΠ· footer ΡΠΏΠΈΡΠΊΠ°;
2. Π΄Π²ΠΈΠ³Π°Π΅Ρ Π²Π½ΠΈΠ· ΠΊΠ½ΠΎΠΏΠΊΠΈ.
- translationYAnimator
public static Animator translationYAnimator(final float start, int end, final View view, int duration) {
ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, end);
animator.setDuration(duration);
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
view.setTranslationY(start);
}
});
return animator;
}
3. ΡΠΊΡΠΎΠ»Π»ΠΈΡ ScrollView Π΄ΠΎ ΡΠ°ΠΌΠΎΠ³ΠΎ Π½ΠΈΠ·Π°;
- scrollAnimator
public static Animator scrollAnimator(int start, int end, final View view, int duration) {
ValueAnimator scrollAnimator = ValueAnimator.ofInt(start, end);
scrollAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
view.scrollTo(0, (int) valueAnimator.getAnimatedValue());
}
});
scrollAnimator.setDuration(duration);
scrollAnimator.addListener(getLayerTypeListener(view));
return scrollAnimator;
}
4. Π½Π°ΠΊΠ»Π°Π΄ΡΠ²Π°Π΅Ρ alpha ΡΡΡΠ΅ΠΊΡ Π½Π° recyclerView.
- alphaAnimator
public static Animator alphaAnimator(int start, int end, View view, int duration) {
ValueAnimator alphaAnimator = ObjectAnimator.ofFloat(view, View.ALPHA, start, end);
alphaAnimator.setDuration(duration);
alphaAnimator.addListener(getLayerTypeListener(view));
return alphaAnimator;
}