Trochę notatek nt. animacji w Android. Odnajdziemy tu pewne formy przypominające te znane z XAML, niemniej jednak dualizm postaci i pewne ich ograniczenia (np. kwestia klikania w animacji widoku, udział kodu nawet przy używaniu XML-a, jest stretch?) powodują, że nie wydają mi się lepsze.
Android Animation
-> View Animation
-> Tween Animation (jedna lub więcej transformacji w jednym widoku; obroty, skalowanie, translacje, znikanie)
-> Frame Animation
-> Property Animation
View animation
animują tylko obiekty View, wyłącznie kilka aspektów (np. skalowanie, rotacja), propercja View się nie zmienia (jedynie widok jest przerysowany)
Tween animation
implementacja: plik XML w res/anim lub kod Java
<alpha
xmlns:android=”http://schemas.android.com/apk/res/android”
android:fromAlpha //float 0.0 – 1.0
android:toAlpha
android:duration=”300” //300ms
android:repeatMode=”restart” (jeszcze raz) lub “reverse”
android:repeatCount=”1”
>
<scale>
android:fromXScale
android:toXScale
android:fromYScale
android:toYScale
android:pivotX //środek 50%
android:pivotY
<translate>
android:fromXDelta //float lub %
android:toXDelta
android:fromYDelta
android:toYDelta
<rotate>
android:fromDegrees
android:toDegrees
android:pivotX
android:pivotY
grupowanie w <set>
mScaleAnim = AnimationUtils.loadAnimation(this, R.anim.scale_anim);
mImageView.startAnimation(mScaleAnim);
animation listener – notyfikacje o zakończeniu / powtórzeniu animacji
implements Animation.AnimationListener
…
mScaleAnim.setAnimationListener(this);
…
@Override
public void onAnimationEnd(Animation anim) //niewywoływane przy ilości powtórzeń INFINITE
onAnimationRepeat(Animation anim)
onAnimationStart(Animation anim)
AlphaAnimation(float fromAlpha, float toAlpha)
…
mScaleAnim = new ScaleAnimation(
1.0f, 1.5f,
1.0f, 1.5f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f
);
mScaleAnim.setDuration(1000);
mScaleAnim.setFillAfter(true);
frame animation
sekwencja klatek w XML
res/drawable/filename.xml
<animation-list>
jeden lub więcej <item>
android:oneshot - wykonanie raz lub zapętlenie
<item>
android:drawable=”@drawable/frame1” - zasób graficzny
android:duration
imageView.setBackgroundResource(R.drawable.frame);
AnimationDrawable frameAnimation = (AnimationDrawable) imageView.getBackground();
if (!frameAnimation.isRunning()) frameAnimation.start();
po przesunięciu animacją obrazek z obsługą klikania obsługuje klikanie w “starym” miejscu
interpolators
definiują stopień zmiany (np. akceleracja itd.)
AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator
AccelerateInterpolator
AnticipateInterpolator
AnticipateOvershootInterpolator
BounceInterpolator
CycleInterpolator
DecelerateInterpolator
LinearInterpolator
OvershootInterpolator
…
<set> – zbiór animacji prostych lub <set>
android:interpolator – także w animacjach prostych
android:sharedInterpolator - współdzielenie pomiędzy wszystkimi dziećmi
android:fillAfter
android:startOffset
property animations
zmiana wartości w czasie, do obiektów wizualnych i niewizualnych
klasy:
1. Value Animator (int, float, object)
2. Object Animator
3. Animator Set
wykonanie:
plik XML w folderze res/animator
plik Java
Value Animator
nie operuje bezpośrednio na obiektach, wymaga listenerów
Object Animator
podklasa Value Animator
ObjectAnimator.ofType(object, “propertyName”, [starting Value], ending value);
…
ObjectAnimator animator = ObjectAnimator.ofFloat(tv, “x”, 50f, 150f);
animator.setDuration(2000);
animator.start();
nie wymaga listenerów
<objectAnimator
android:propertyName=”” //alpha | rotation | rotationY | rotationX | scaleX | scaleY | translationX | translationY | x | y (translacja względem kontenera)
android:duration=””
android:valueFrom=””
android:valueTo=””
android:startOffset=””
android:repeatCount=””
android:repeatMode=”” //repeat | reverse
android:valueType=”” // intType | floatType
/>
<set> - może skupiać także <objectAnimator>
android:ordering // sequentially | together
Animator anim = AnimatorInflater.LoadAnimator(this, R.animator.rotate);
anim.setTarget(mImage);
anim.start();
AnimatorSet rootSet = new AnimatorSet();
…
rootSet.play(rotate /*object animator*/).before(childSet);
childSet.play(scaleX).with(scaleY);
rootSet.start();
prawidłowe klikanie na przesunięty obrazek przez property animation
Evaluators
wyliczanie wartości dla propercji w czasie
pomoc w animacji kolorów ARGB i obiektów Rect z metodą ofObject
rodzaje:
IntEvaluator
FloatEvaluator
ArgbEvaluator
TypeEvaluator – interfejs dla własnego ewaluatora dla propercji o typach innych niż int, float czy kolor
ObjectAnimator anim = ObjectAnimator.ofObject(target, “backgroundColor”, new ArgbEvaluator(), Color.RED, Color.GREEN);
Tranzycje między ekranami
startActivity(new Intent(MainActivity.this, SecondActivity.class));
overridePendingTransition(R.anim.activity_open_translate /*wejście SecondActivity*/, R.anim.activity_close_scale /*wyjście z MainActivity*/); //animacje view
android:aduration = “@android:integer/config_longAnimTime”
Animacje w cyklu życia
animation.com.recycleviewanim
<android.support.v7.widget.RecyclerView
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:id=”@+id/recycleView”>
</android.support.v7.widget.RecyclerView>
CustomAdapter mAdapter = new CustomAdapter(this, new Data().getData());
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
animacje elementów podczas przewijania listy
…
LinearLayoutManager mLinearLayoutManagerHorizontal = new LinearLayoutManager(this);
mLinearLayoutManagerHorizontal.setOrientation(LinearLayoutManager.HORIZONTAL);
mRecyclerView.setLayoutManager(mLinearLayoutManagerHorizontal);
…
animacje Material Design
circual reveal
//sdk 21
ViewAnimationUtils.createCircularReveal(textDesc, centerX, centerY, 0, radius).start();
…
ViewPager Animation
Depth Page Transformer
Zoom out Transformer
Rotation Transformer
<android.support.v4.view.ViewPager … />
PagerAdapter adapter = new ViewPagerAdapter(MainActivity.this, mImageId); //ViewPagerAdapter extends PagerAdapter
mViewPager.setAdapter(adapter);
…
mViewPager.setPageTransformer(true, new ZoomOut()); //new DepthPage(), new Rotation()
//ZoomOut implements ViewPager.PagerTransformer