1. 程式人生 > >View動畫、幀動畫、屬性動畫

View動畫、幀動畫、屬性動畫

轉載請註明出處,謝謝

View動畫:

1、View可以使用程式碼來設定也可以使用xml檔案來設定,在xml檔案裡面對應的標籤為: <translate>…………</translate>:用於平移 <scale>…………</scale>:用於縮放
<rotate>…………</rotate>:用於旋轉
<alpha>…………</alpha>:用於透明度的變化
上程式碼:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:shareInterpolator="true">

    <translate
        android:fromXDelta="0"
        android:toXDelta="100"
        android:fromYDelta="0"
        android:toYDelta="100"
        android:duration="100"
        />
    <rotate
        android:fromDegrees="0"
        android:toDegrees="270"
        android:duration="300"
        android:pivotX="0"
        android:pivotY="0"
        />
    <alpha
        android:fromAlpha="0"
        android:toAlpha="1"
        />

    <scale
        android:fromXScale="20"
        android:toXScale="100"
        android:fromYScale="40"
        android:toYScale="80"
        android:pivotY="20"
        android:pivotX="40"
        />
</set>

程式碼控制分別為Animation的4個子類:TranslateAnimation、ScaleAnimation、RotateAnimation、AlphaAnimation 程式碼也可以實現動畫:
mAlphaAnimation = new AlphaAnimation(0, 1);
        mAlphaAnimation.setDuration(200);
        mMenu.startAnimation(mAlphaAnimation);<span>	</span>

2、程式碼中獲取xml中的View動畫 動畫物件=AnimationUtils.load(上下文,R.anim.動畫檔案的名字); 執行動畫的物件.startAnimation(動畫物件); 上程式碼:
 mMenu = (SlidingMenu) findViewById(R.id.id_menu);

        mAnimation = AnimationUtils.loadAnimation(this, R.anim.animation_set);
        mMenu.startAnimation(mAnimation);
        mAnimation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {

            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });

3、監聽View動畫 View動畫的監聽使用setAnimationListener 4、View動畫的特殊使用場景 在ViewGroup中控制元素的進出效果,在控制元件的屬性中加上layoutAnimation就可以,也可以在程式碼中設定 listView.setLayoutAnimation(new LayoutAnimationController(AnimationUtils.loadAnimation(上下文,R.anim.anim_item))); 當然還有Acticity預設的切換效果:使用overridePendingTransition(Acticity被開啟的的動畫的ID,Acticity被關閉下的動畫的id); 這個方法必須在startActivity或者finish的後面,否則起不到效果。

幀動畫(AnimationDrawable)

xml中的程式碼格式:<animation_list……> <item……/> </animation_list> 上程式碼:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
<!--oneshot:代表是否執行一次-->
    <item android:drawable="@drawable/ic"
        android:duration="500"
        />
    <item android:drawable="@drawable/ic_launcher"
          android:duration="500"
        />
    <item android:drawable="@drawable/ic_action_github"
          android:duration="500"
        />
    <item android:drawable="@drawable/img_1"
          android:duration="500"
        />

</animation-list>

獲取xml中的動畫: 執行動畫的物件.setBackgroundResource(R.drawable.動畫的檔名); 幀動畫的物件.執行動畫的物件.getBackground(); 幀動畫物件.start(); 上程式碼:
mMenu.setBackgroundResource(R.drawable.frame_animation);
        mBackground = (AnimationDrawable)mMenu.getBackground();
        mBackground.start();

幀動畫有個缺點就是比較容易導致OOM。

屬性動畫

ValueAnimator、ObjectAnimator、AnimatorSet……
 mAnimatorSet = new AnimatorSet();
        mAnimatorSet.playTogether(ObjectAnimator.ofFloat(mMenu,"rotationX",0,360),
                                    ObjectAnimator.ofFloat(mMenu,"rotationY",0,180),
                                    ObjectAnimator.ofFloat(mMenu,"ratation",0,-90),
                                    ObjectAnimator.ofFloat(mMenu,"scaleX",1,1.5f),
                                    ObjectAnimator.ofFloat(mMenu,"scaleY",1,0.5f),
                                    ObjectAnimator.ofFloat(mMenu,"alpha",1,0.25f,1));
        mAnimatorSet.setDuration(5*1000).start();

使用方法:ObjectAniamtor.ofFloat(執行動畫的物件,“動畫的屬性”,-myObject.getHeight()).start(); 也可以使用xml中的屬性動畫 呼叫xml中的屬性動畫:set=(AnimatorInflater.loadAnimator(上下文,動畫的id)); set.setTarget(mButton); set.start(); 監聽屬性動畫:
 ObjectAnimator.ofFloat(mMenu, "rotationX", 0, 360).addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                
            }
        });