Android 動畫三種 摘要
動畫三種 1幀動畫 2view 3屬性動畫
A 幀動畫 是把一些列圖片類似於播放展示
- img_loding.setImageResource(R.drawable.loading_animation);
- animationDrawable = (AnimationDrawable) img_loding.getDrawable();
- animationDrawable.start(); //Drawable作為View的背景並通過Drawable來播放動畫
B View 動畫
PS:
View動畫改變的只是顯示,並不能在新的位置響應事件。
同理,有時候會出現動畫完成後View無法隱藏的現象,即setVisibility(View.GONE)失效,這時只需
呼叫view.clearAnimation()清除View動畫即可解決問題。
1 在程式碼裡使用XML中定義好的動畫:
Animation animation = AnimationUtils.loadAnimation(this, R.anim.animation_demo);
view.startAnimation(animation);
2 在程式碼裡直接使用View動畫:
示例:
AlphaAnimation animation = new AlphaAnimation(0,1);
animation.setDuration(1000);
view.startAnimation(animation);
動畫集合示例:
AnimationSet set = new AnimationSet(true);
set.setDuration(1000);
AlphaAnimation animation1 = new AlphaAnimation(0,1);
animation1.setDuration(1000);
TranslateAnimation animation2 = new TranslateAnimation(0,100, 0, 200);
animation2.setDuration(1000);
set.addAnimation(animation1);
set.addAnimation(animation2);
view.startAnimation(set);
//動畫監聽
animation.setAnimationListener(new Animation.AnimationListener(){
@Override
public void onAnimationStart(Animation animation){
//動畫開始時
}
@Override
public void onAnimationEnd(Animation animation){
//動畫結束時
}
@Override
public void onAnimationRepeat(Animation animation){
//動畫重複時
}
});
3 屬性動畫 ps Android11 3.0 才加入 object必須提供setA方法,如果動畫沒有傳遞初始值,還必須提供getA方法,因為系統要去獲取屬性a的初始值(如果獲取不到初始值,程式直接crash
3.1 ValueAnimator
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f, 3f, 5f);
anim.setDuration(1000);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float currentValue = (float) animation.getAnimatedValue();
});
anim.start();
3.2
ObjectAnimator
ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(image, "scaleX", 0f, 1f); ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(image, "scaleY", 0f, 1f); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether(scaleXAnimator, scaleYAnimator); // 設定插值器 animatorSet.setInterpolator(new JellyInterpolator()); animatorSet.setDuration(3000); animatorSet.start(); animator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animator) { } @Override public void onAnimationEnd(Animator animator) { } @Override public void onAnimationCancel(Animator animator) { } @Override public void onAnimationRepeat(Animator animator) { } });
Android 3.0 之後,Google給View增加了animate方法來直接驅動 屬性動畫,它可以被認為是屬性動畫的一種簡寫方式。
- private void animateButtonsIn() {
- for (int i = 0; i < bgViewGroup.getChildCount(); i++) {
- View child = bgViewGroup.getChildAt(i);
- child.animate()
- .setStartDelay(100 + i * DELAY)
- .setInterpolator(interpolator)
- .alpha(1)
- .scaleX(1)
- .scaleY(1);
- }
- }