Android
Animatorzy
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:
- Utwórz
ValueAnimator
który będzie animował wartość odmin
domax
- 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
)
- 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();
- 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
)
- 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();
- 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);
}
}