Szukaj…


Wstrząśnij animacją ImageView

W folderze res utwórz nowy folder o nazwie „anim”, aby przechowywać zasoby animacji i umieść go w tym folderze.

shakeanimation.xml

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="100"
    android:fromDegrees="-15"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatCount="infinite"
    android:repeatMode="reverse"
    android:toDegrees="15" />

Utwórz puste działanie o nazwie Lądowanie

activity_landing.xml

  <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageView
            android:id="@+id/imgBell"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:src="@mipmap/ic_notifications_white_48dp"/>

    </RelativeLayout>

I metoda animacji podglądu obrazu na Landing.java

Context mContext;


 @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mContext=this;
                setContentView(R.layout.activity_landing);

                AnimateBell();
        }

public void AnimateBell() {
        Animation shake = AnimationUtils.loadAnimation(mContext, R.anim.shakeanimation);
        ImageView imgBell= (ImageView) findViewById(R.id.imgBell);
        imgBell.setImageResource(R.mipmap.ic_notifications_active_white_48dp);
        imgBell.setAnimation(shake);
    }

Animacja pojawiania się / zanikania

Aby uzyskać widok, który będzie powoli ObjectAnimator się lub ObjectAnimator , użyj ObjectAnimator . Jak widać w poniższym kodzie, ustaw czas trwania za pomocą .setDuration(millis) gdzie parametr millis to czas trwania (w milisekundach) animacji. W poniższym kodzie widoki będą pojawiać się / zanikać w ciągu 500 milisekund lub 1/2 sekundy. Aby rozpocząć ObjectAnimator animacji „s, zadzwoń .start() . Po zakończeniu animacji onAnimationEnd(Animator animation) jest onAnimationEnd(Animator animation) . Oto dobre miejsce, aby ustawić widoczność widoku na View.GONE lub View.VISIBLE .

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;

void fadeOutAnimation(View viewToFadeOut) {
    ObjectAnimator fadeOut = ObjectAnimator.ofFloat(viewToFadeOut, "alpha", 1f, 0f);

    fadeOut.setDuration(500);
    fadeOut.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            // We wanna set the view to GONE, after it's fade out. so it actually disappear from the layout & don't take up space.
            viewToFadeOut.setVisibility(View.GONE);
        }
    });

    fadeOut.start();
}

void fadeInAnimation(View viewToFadeIn) {
    ObjectAnimator fadeIn = ObjectAnimator.ofFloat(viewToFadeIn, "alpha", 0f, 1f);
    fadeIn.setDuration(500);

    fadeIn.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationStar(Animator animation) {
            // We wanna set the view to VISIBLE, but with alpha 0. So it appear invisible in the layout.
            viewToFadeIn.setVisibility(View.VISIBLE);
            viewToFadeIn.setAlpha(0);
        }
    });

    fadeIn.start();
}

TransitionDrawable animacja

W tym przykładzie wyświetlana jest transakcja dla widoku obrazu z tylko dwoma obrazami (można użyć większej liczby obrazów jeden po drugim dla pozycji pierwszej i drugiej warstwy po każdej transakcji jako pętli)

  • dodaj tablicę obrazków do res/values/arrays.xml
<resources>

    <array
        name="splash_images">
        <item>@drawable/spash_imge_first</item>
        <item>@drawable/spash_img_second</item>
    </array>

</resources>

    private Drawable[] backgroundsDrawableArrayForTransition;
    private TransitionDrawable transitionDrawable;

private void backgroundAnimTransAction() {

        // set res image array
        Resources resources = getResources();
        TypedArray icons = resources.obtainTypedArray(R.array.splash_images);

        @SuppressWarnings("ResourceType")
        Drawable drawable = icons.getDrawable(0);    // ending image

        @SuppressWarnings("ResourceType")
        Drawable drawableTwo = icons.getDrawable(1);   // starting image


        backgroundsDrawableArrayForTransition = new Drawable[2];
        backgroundsDrawableArrayForTransition[0] = drawable;
        backgroundsDrawableArrayForTransition[1] = drawableTwo;
        transitionDrawable = new TransitionDrawable(backgroundsDrawableArrayForTransition);

        // your image view here - backgroundImageView
        backgroundImageView.setImageDrawable(transitionDrawable);
        transitionDrawable.startTransition(4000);

        transitionDrawable.setCrossFadeEnabled(false); // call public methods  

      
    }

ValueAnimator

ValueAnimator wprowadza prosty sposób animowania wartości (określonego typu, np. int , float itp.).

Zwykły sposób korzystania z niego to:

  1. Utwórz ValueAnimator który będzie animował wartość od min do max
  2. Dodaj UpdateListener w którym użyjesz obliczonej wartości animowanej (którą możesz uzyskać za pomocą getAnimatedValue() )

Istnieją dwa sposoby utworzenia ValueAnimator :

(przykładowy kod animuje 40f float z 20f do 40f w 250ms )

  1. Z xml (umieść go w /res/animator/ ):
<animator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="250"
    android:valueFrom="20"
    android:valueTo="40"
    android:valueType="floatType"/>
ValueAnimator animator = (ValueAnimator) AnimatorInflater.loadAnimator(context, 
        R.animator.example_animator);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator anim) {
        // ... use the anim.getAnimatedValue()
    }
});
// set all the other animation-related stuff you want (interpolator etc.)
animator.start();
  1. Z kodu:
ValueAnimator animator = ValueAnimator.ofFloat(20f, 40f);
animator.setDuration(250);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator anim) {
        // use the anim.getAnimatedValue()
    }
});
// set all the other animation-related stuff you want (interpolator etc.)
animator.start();

ObjectAnimator

ObjectAnimator to podklasa ValueAnimator z dodatkową możliwością ustawiania obliczonej wartości na właściwość target View .


Podobnie jak w ValueAnimator , istnieją dwa sposoby utworzenia ObjectAnimator :

(przykładowy kod animuje alpha View z 0.4f do 0.2f w ciągu 0.2f 250ms )

  1. Z xml (umieść go w /res/animator )
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
                android:duration="250"
                android:propertyName="alpha"
                android:valueFrom="0.4"
                android:valueTo="0.2"
                android:valueType="floatType"/>
ObjectAnimator animator = (ObjectAnimator) AnimatorInflater.loadAnimator(context,
        R.animator.example_animator);
animator.setTarget(exampleView);
// set all the animation-related stuff you want (interpolator etc.)
animator.start();
  1. Z kodu:
ObjectAnimator animator = ObjectAnimator.ofFloat(exampleView, View.ALPHA, 0.4f, 0.2f);
animator.setDuration(250);
// set all the animation-related stuff you want (interpolator etc.)
animator.start();

ViewPropertyAnimator

ViewPropertyAnimator to uproszczony i zoptymalizowany sposób animowania właściwości View .

Każdy pojedynczy View ma obiekt ViewPropertyAnimator dostępny za pośrednictwem metody animate() . Możesz go użyć do animowania wielu właściwości jednocześnie za pomocą prostego wywołania. Każda metoda ViewPropertyAnimator określa wartość docelową określonego parametru, do którego ViewPropertyAnimator powinien animować.

View exampleView = ...;
exampleView.animate()
        .alpha(0.6f)
        .translationY(200)
        .translationXBy(10)
        .scaleX(1.5f)
        .setDuration(250)
        .setInterpolator(new FastOutLinearInInterpolator());

Uwaga: Wywołanie start() dla obiektu ViewPropertyAnimator NIE jest obowiązkowe. Jeśli tego nie zrobisz, pozwalasz platformie obsłużyć rozpoczęcie animacji w odpowiednim czasie (następna obsługa animacji minie). Jeśli faktycznie to zrobisz (wywołaj start() ), upewnisz się, że animacja zostanie uruchomiona natychmiast.

Rozwiń i zwiń animację widoku

public class ViewAnimationUtils {
        
        public static void expand(final View v) {
            v.measure(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
            final int targtetHeight = v.getMeasuredHeight();
    
            v.getLayoutParams().height = 0;
            v.setVisibility(View.VISIBLE);
            Animation a = new Animation()
            {
                @Override
                protected void applyTransformation(float interpolatedTime, Transformation t) {
                    v.getLayoutParams().height = interpolatedTime == 1
                            ? LayoutParams.WRAP_CONTENT
                            : (int)(targtetHeight * interpolatedTime);
                    v.requestLayout();
                }
    
                @Override
                public boolean willChangeBounds() {
                    return true;
                }
            };
    
            a.setDuration((int)(targtetHeight / v.getContext().getResources().getDisplayMetrics().density));
            v.startAnimation(a);
        }
    
        public static void collapse(final View v) {
            final int initialHeight = v.getMeasuredHeight();
    
            Animation a = new Animation()
            {
                @Override
                protected void applyTransformation(float interpolatedTime, Transformation t) {
                    if(interpolatedTime == 1){
                        v.setVisibility(View.GONE);
                    }else{
                        v.getLayoutParams().height = initialHeight - (int)(initialHeight * interpolatedTime);
                        v.requestLayout();
                    }
                }
    
                @Override
                public boolean willChangeBounds() {
                    return true;
                }
            };
    
            a.setDuration((int)(initialHeight / v.getContext().getResources().getDisplayMetrics().density));
            v.startAnimation(a);
        }
    }


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow